Skip to content

Commit

Permalink
针对token校验、登录验证码、全局拦截等代码进行优化
Browse files Browse the repository at this point in the history
  • Loading branch information
2594771947 committed Sep 23, 2021
1 parent ac4e61f commit 9c9f6cd
Show file tree
Hide file tree
Showing 8 changed files with 79 additions and 85 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ public IApiResult<UserDto> UserLogin(string userId, string pwd,string guidKey,st
{
var res = new ApiResult<UserDto>();
UserDto userDto = new UserDto();
if (_cacheManager.Get(guidKey).ToString().ToLower() != validateCode.ToLower()) {
return res.NotOk("验证码错误!");
if (_cacheManager.Get(guidKey)?.ToString().ToLower() != validateCode.ToLower()) {
return res.NotOk("验证码过期!");
}
var loginDto = _sysUserService.Login(userId, pwd, tenantId);
if (loginDto.State)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,13 +137,12 @@

**/

"MultiTnancy": true, //前端登录和后端要保持一致,否则拦截器那边会异常报错
"MultiTnancy": false, //前端登录和后端要保持一致,否则拦截器那边会异常报错
"TenantKeyName": "tenantId",
"DefaultTenantId": 1,
"DefaultTenantId": 0,
"DataType": 0,
//sqlserver
//"DefaultDbConnectionString": "Data Source = .;Initial Catalog = bigDataDB;User Id = sa;Password = 123456;",


//mysql
"DefaultDbConnectionString": "Server=127.0.0.1;Port=3307;User Id=root;Password=123456;Database=bigDataDB;",
"TenantList": [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,13 @@ public static IdleBus<IFreeSql> AddTenantDb(this IServiceCollection services)
DefaultConfig.TenantSettingDto.DefaultTenantId.ToString(),
DefaultConfig.TenantSettingDto.DataType,
DefaultConfig.TenantSettingDto.DefaultDbConnectionString);

foreach (var i in DefaultConfig.TenantSettingDto.TenantList)
{
SetTenantDb(services,ib, i.TenantId.ToString(), i.DataType, i.DbConnectionString);
if (DefaultConfig.TenantSettingDto.MultiTnancy) {
foreach (var i in DefaultConfig.TenantSettingDto.TenantList)
{
SetTenantDb(services, ib, i.TenantId.ToString(), i.DataType, i.DbConnectionString);
}
}


return ib;
//services.AddSingleton(ib);//全局单例
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,11 @@ public static void ValidateToken(string token, IHttpContextAccessor httpContext
try
{
var tenantObj = load[DefaultConfig.TenantSettingDto.TenantKeyName]?.ToString();

if (string.IsNullOrWhiteSpace(tenantObj) || DefaultConfig.TenantSettingDto.TenantList.Where(x => x.TenantId == int.Parse(tenantObj)).FirstOrDefault() == null)//不存在租户id,或者租户id不在配置中
throw new Exception(DefaultConfig.DefaultAppConfigDto.ExceptionKey + "token 相关信息无效,请从新获取Token!");

if (DefaultConfig.TenantSettingDto.MultiTnancy)
{//开启租户情况下,进行校验
if (string.IsNullOrWhiteSpace(tenantObj) || DefaultConfig.TenantSettingDto.TenantList.Where(x => x.TenantId == int.Parse(tenantObj)).FirstOrDefault() == null)//不存在租户id,或者租户id不在配置中
throw new Exception(DefaultConfig.DefaultAppConfigDto.ExceptionKey + "token 相关信息无效,请从新获取Token!");
}

var tokenKey = load[DefaultConfig.DefaultAppConfigDto.TokenKeyName]?.ToString();
//刷新token,自动放过去
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,48 +61,52 @@ public override void OnActionExecuted(ActionExecutedContext context)
_requestInfoDto.StopTime = DateTime.Now;
_requestInfoDto.ElapsedMilliseconds = Convert.ToInt64((_requestInfoDto.StopTime - _requestInfoDto.StartTime).TotalMilliseconds);
var obj = context.Result;
if (obj==null)
_requestInfoDto.ResponseState = false;
var resultType = obj?.GetType();
if (obj!=null)//不为空,说明程序正常有返回值,如果为null,说明可能报空了
{
throw new Exception(DefaultConfig.DefaultAppConfigDto.ExceptionKey + "获取context.Result 对象为空!");
}
_requestInfoDto.ResponseState = false;
var resultType = context.Result?.GetType();
try
{

if (resultType.FullName.Equals(typeof(JsonResult).FullName))

try
{
var result = (JsonResult)obj;
//_requestInfoDto.ResponseData = result.Value == null ? "" : System.Text.Json.JsonSerializer.Serialize(result.Value);
//aop拦截处理 如果不是我们已经定义标准化返回,那么我们需要在外层包一层,如果不是,就直接让他自己按照正常处理返回
if ((result.Value.GetType().Name.Contains(typeof(ApiResult).Name) || result.Value.GetType().Name.Contains(typeof(ApiResult<>).Name)))

if (resultType.FullName.Equals(typeof(JsonResult).FullName))
{
var State = System.Text.Json.JsonSerializer.Serialize(result.Value).ToJObject().GetValue("State");
_requestInfoDto.ResponseState =Convert.ToBoolean(State);
var result = (JsonResult)obj;
//_requestInfoDto.ResponseData = result.Value == null ? "" : System.Text.Json.JsonSerializer.Serialize(result.Value);
//aop拦截处理 如果不是我们已经定义标准化返回,那么我们需要在外层包一层,如果不是,就直接让他自己按照正常处理返回
if ((result.Value.GetType().Name.Contains(typeof(ApiResult).Name) || result.Value.GetType().Name.Contains(typeof(ApiResult<>).Name)))
{
var State = System.Text.Json.JsonSerializer.Serialize(result.Value).ToJObject().GetValue("State");
_requestInfoDto.ResponseState = Convert.ToBoolean(State);
}
}
}
if (resultType.FullName.Equals(typeof(ObjectResult).FullName))
{
var result = (ObjectResult)context.Result;
//_requestInfoDto.ResponseData = result.Value == null ? "" : System.Text.Json.JsonSerializer.Serialize(result.Value);
//aop拦截处理 如果不是我们已经定义标准化返回,那么我们需要在外层包一层,如果不是,就直接让他自己按照正常处理返回
if ((result.Value.GetType().Name.Contains(typeof(ApiResult).Name) || result.Value.GetType().Name.Contains(typeof(ApiResult<>).Name)))
if (resultType.FullName.Equals(typeof(ObjectResult).FullName))
{
var State = System.Text.Json.JsonSerializer.Serialize(result.Value).ToJObject().GetValue("State");
_requestInfoDto.ResponseState = Convert.ToBoolean(State);
var result = (ObjectResult)context.Result;
//_requestInfoDto.ResponseData = result.Value == null ? "" : System.Text.Json.JsonSerializer.Serialize(result.Value);
//aop拦截处理 如果不是我们已经定义标准化返回,那么我们需要在外层包一层,如果不是,就直接让他自己按照正常处理返回
if ((result.Value.GetType().Name.Contains(typeof(ApiResult).Name) || result.Value.GetType().Name.Contains(typeof(ApiResult<>).Name)))
{
var State = System.Text.Json.JsonSerializer.Serialize(result.Value).ToJObject().GetValue("State");
_requestInfoDto.ResponseState = Convert.ToBoolean(State);
}
}




}
catch (Exception ex)
{
throw new Exception(DefaultConfig.DefaultAppConfigDto.ExceptionKey + "审计日志拦截返回值处理失败!" + ex.ToString());
}




}
catch (Exception ex)
{
throw new Exception(DefaultConfig.DefaultAppConfigDto.ExceptionKey + "审计日志拦截返回值处理失败!" + ex.ToString());
}



//throw new Exception(DefaultConfig.DefaultAppConfigDto.ExceptionKey + "获取context.Result 对象为空!");
}
//写入审计日志
WriteRequestLog(context, _requestInfoDto);
}

Expand Down Expand Up @@ -132,18 +136,13 @@ public override void OnActionExecuting(ActionExecutingContext context)
string[] filterActions = DefaultConfig.FilterUrls;
var controllerName = context.RouteData.Values["controller"]?.ToString();//获取当前控制器名称
if (filterActions.Any(x => x.Contains(context.HttpContext.Request.Path)))
{//可以放行
{//可以放行,不校验
return;
}

#region 1-指定控制器允许通过 只要访问的是集合内的控制器,才允许请求
//string[] allowAnonymousStringArray = new string[] { "Values", "Car" };

//if (!allowAnonymousStringArray.Any(x => x == controllerName))
//{
// context.Result = new JsonResult(new ApiResult<string>() { Code = 404, Message = "访问的api不存在或权限不足!", Value = "" });
//}
string requestPath = context.HttpContext.Request.Path.Value;// /api/Identity/GetTokenByLogin
string requestPath = context.HttpContext.Request.Path.Value;

#endregion

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,11 @@ public override void OnResultExecuted(ResultExecutedContext context)
public override void OnResultExecuting(ResultExecutingContext context)
{
var obj = context.Result;
if (context.Result?.GetType() == typeof(ObjectResult))
if (obj?.GetType() == typeof(ObjectResult))
{
try
{
var result = (ObjectResult)context.Result;
var result = (ObjectResult)obj;

//aop拦截处理 如果不是我们已经定义标准化返回,那么我们需要在外层包一层,如果不是,就直接让他自己按照正常处理返回
if (!(result.Value.GetType().Name.Contains(typeof(ApiResult).Name)|| result.Value.GetType().Name.Contains(typeof(ApiResult<>).Name)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using System.Threading.Tasks;
using YC.ApplicationService;
using YC.ApplicationService.ApplicationService.Dto;
using YC.ApplicationService.DefaultConfigure;
using YC.Common.ShareUtils;
using YC.Core;
using YC.Core.Cache;
Expand Down Expand Up @@ -69,9 +70,7 @@ public DefaultTenant(IHttpContextAccessor httpContextAccessor, ICacheManager cac
}
else
{
tenantObj = TokenContext.GetPayLoad(token)[DefaultConfig.TenantSettingDto.TenantKeyName]?.ToString();
if (string.IsNullOrWhiteSpace(tenantObj) || DefaultConfig.TenantSettingDto.TenantList.Where(x => x.TenantId == int.Parse(tenantObj)).FirstOrDefault() == null)//不存在租户id,或者租户id不在配置中
throw new Exception(DefaultConfig.DefaultAppConfigDto.ExceptionKey + "token 相关信息无效,请从新获取Token!");

if (DefaultConfig.DefaultAppConfigDto.VerifyTokenUniqueness) {//演示系统,该属性不开启,默认不校验唯一性
ValidateTokenExtenstions.ValidateToken(token, _httpContextAccessor, _cacheManager);
}
Expand All @@ -81,38 +80,29 @@ public DefaultTenant(IHttpContextAccessor httpContextAccessor, ICacheManager cac

}


//var tenantObj = _httpContextAccessor.HttpContext.Request.Form.Where(x => x.Key.Equals(DefaultConfig.TenantSettingDto.TenantKeyName)).Select(x => x.Value).FirstOrDefault();

//初始化做一次数据配置导入
if (string.IsNullOrEmpty(tenantObj))
{
tenantObj =DefaultConfig.TenantSettingDto.DefaultTenantId.ToString();
var tenantInfo = new TenantInfo();
if (!DefaultConfig.TenantSettingDto.MultiTnancy)
{ //不开启多租户,采用默认配置
tenantInfo.DbConnectionString = DefaultConfig.TenantSettingDto.DefaultDbConnectionString;
tenantInfo.TenantId = DefaultConfig.TenantSettingDto.DefaultTenantId;
}
var data = DefaultConfig.TenantSettingDto.TenantList.Where(x => x.TenantId == int.Parse(tenantObj)).FirstOrDefault();

if (data == null)
{

if (DefaultConfig.TenantSettingDto.MultiTnancy)//如果开启多租户情况下,那么就必须查找
{////说明传入的租户不在配置中,这里可以改造在路由请求中租户采用对应的key 来进行判定,通过加解密进行拆解分析
throw new Exception(DefaultConfig.DefaultAppConfigDto.ExceptionKey + "不存在对应的租户!");
}
else
else { //多租户情况下
//初始化做一次数据配置导入
if (string.IsNullOrEmpty(tenantObj))
{
data = new ApplicationService.DefaultConfigure.TenantInfo();
data.DbConnectionString = DefaultConfig.TenantSettingDto.DefaultDbConnectionString;
data.TenantId = DefaultConfig.TenantSettingDto.DefaultTenantId;
tenantObj = DefaultConfig.TenantSettingDto.DefaultTenantId.ToString();
}

tenantInfo = DefaultConfig.TenantSettingDto.TenantList.Where(x => x.TenantId == int.Parse(tenantObj)).FirstOrDefault();
if (string.IsNullOrWhiteSpace(tenantInfo.DbConnectionString)) {
throw new Exception(DefaultConfig.DefaultAppConfigDto.ExceptionKey + "不存在对应的租户!");
}
}

this.TenantId = data.TenantId;
this.TenantDbString = data.DbConnectionString;
//TenantId = 1;
//this.TenantDbString = "Server=127.0.0.1;Port=3307;User Id=root;Password=123456;Database=bigDataDB;";



this.TenantId = tenantInfo.TenantId;
this.TenantDbString = tenantInfo.DbConnectionString;

}

Expand Down
7 changes: 5 additions & 2 deletions src/Front/yc.webfront/src/view/Login.vue
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@
},
loading: false,
loginGuid: '', //验证码配套的guid
isMultiTnancy: true, //是否开启多租户
isMultiTnancy: false, //是否开启多租户
imgCode: '', //验证码
errorInfo:"如果遇到无法登录情况,可能是其他体验者操作失误删除数据,请等待2分钟后重新体验,本演示系统采用定时服务重置数据库。",
/* 表单规则验证 */
Expand Down Expand Up @@ -165,7 +165,10 @@
this.loading = false
console.log(responseData)
this.changeCodeImg()//刷新验证码
if (responseData.code != 200) return this.$msg.error(responseData.message+" "+this.errorInfo)
if (responseData.code != 200){
this.init()//重置key
return this.$msg.error(responseData.message+" "+this.errorInfo)
}
this.$msg.success('登录成功!')
//将当前的token 存储到sessionStorage
window.sessionStorage.clear()
Expand Down

0 comments on commit 9c9f6cd

Please sign in to comment.