数据权限功能、用户信息缓存

This commit is contained in:
陈淳
2022-11-04 23:23:54 +08:00
parent 23a9d02aba
commit 97b4ab2f15
6 changed files with 47 additions and 14 deletions

View File

@@ -35,7 +35,11 @@ namespace Yi.Framework.ApiMicroservice.Controllers
private SecurityCodeHelper _securityCode; private SecurityCodeHelper _securityCode;
private IRepository<UserEntity> _repository; private IRepository<UserEntity> _repository;
private CacheInvoker _cacheDb; private CacheInvoker _cacheDb;
public AccountController(ILogger<UserEntity> logger, IUserService iUserService, JwtInvoker jwtInvoker, SecurityCodeHelper securityCode, CacheInvoker cacheInvoker) public AccountController(ILogger<UserEntity> logger,
IUserService iUserService,
JwtInvoker jwtInvoker,
SecurityCodeHelper securityCode,
CacheInvoker cacheInvoker)
{ {
_iUserService = iUserService; _iUserService = iUserService;
_jwtInvoker = jwtInvoker; _jwtInvoker = jwtInvoker;
@@ -87,15 +91,38 @@ namespace Yi.Framework.ApiMicroservice.Controllers
var loginInfo = HttpContext.GetLoginLogInfo(); var loginInfo = HttpContext.GetLoginLogInfo();
loginInfo.LoginUser = loginDto.UserName; loginInfo.LoginUser = loginDto.UserName;
loginInfo.LogMsg = "登录成功!"; loginInfo.LogMsg = "登录成功!";
var loginLogRepository = _repository.ChangeRepository<Repository<LoginLogEntity>>(); var loginLogRepository = _repository.ChangeRepository<Repository<LoginLogEntity>>();
UserEntity user = new(); UserEntity user = new();
//这里其实可以返回Dto
if (await _iUserService.Login(loginDto.UserName, loginDto.Password, o => user = o)) if (await _iUserService.Login(loginDto.UserName, loginDto.Password, o => user = o))
{ {
//根据用户id获取改用户的完整信息
var userRoleMenu = await _iUserService.GetUserAllInfo(user.Id); var userRoleMenu = await _iUserService.GetUserAllInfo(user.Id);
//如果该用户没有任何一个菜单,或者没有任何一个角色,无意义的登录
if (userRoleMenu.PermissionCodes.Count == 0)
{
return Result.Error("登录禁用!该用户分配无任何权限,无意义登录!");
}
//将该用户的完整信息缓存一份至缓存后续需要完整用户信息只需通过token中的id从缓存中获取即可
//先制作token
var token = _jwtInvoker.GetAccessToken(userRoleMenu.User, userRoleMenu.Menus);
//需要注意缓存用户信息时间应大于或等于token过期时间
_cacheDb.Set($"Yi:UserInfo:{user.Id}", userRoleMenu, _jwtInvoker.GetTokenExpiration());
await loginLogRepository.InsertReturnSnowflakeIdAsync(loginInfo); await loginLogRepository.InsertReturnSnowflakeIdAsync(loginInfo);
return Result.Success(loginInfo.LogMsg).SetData(new { token = _jwtInvoker.GetAccessToken(userRoleMenu.User, userRoleMenu.Menus) }); return Result.Success(loginInfo.LogMsg).SetData(new { token });
} }
loginInfo.LogMsg = "登录失败!用户名或者密码错误!"; loginInfo.LogMsg = "登录失败!用户名或者密码错误!";
await loginLogRepository.InsertReturnSnowflakeIdAsync(loginInfo); await loginLogRepository.InsertReturnSnowflakeIdAsync(loginInfo);
@@ -137,11 +164,13 @@ namespace Yi.Framework.ApiMicroservice.Controllers
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[HttpGet] [HttpGet]
public async Task<Result> GetUserAllInfo() public Result GetUserAllInfo()
{ {
//通过鉴权jwt获取到用户的id //通过鉴权jwt获取到用户的id
var userId = HttpContext.GetUserIdInfo(); var userId = HttpContext.GetUserIdInfo();
var data = await _iUserService.GetUserAllInfo(userId); //此处从缓存中获取即可
var data = _cacheDb.Get<UserRoleMenuDto>($"Yi:UserInfo:{userId}");
//var data = await _iUserService.GetUserAllInfo(userId);
//系统用户数据被重置,老前端访问重新授权 //系统用户数据被重置,老前端访问重新授权
if (data is null) if (data is null)
{ {

View File

@@ -60,10 +60,9 @@ builder.Host.ConfigureLogging(loggingBuilder =>
#endregion #endregion
builder.Services.AddIocService(builder.Configuration); builder.Services.AddIocService(builder.Configuration);
#region #region
//Sqlsugar<61><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>,<2C>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD>޹<EFBFBD><DEB9>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҪRedis<EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Sqlsugar<61><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>,<2C>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD>޹<EFBFBD><DEB9>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD><EFBFBD><EFBFBD>
#endregion #endregion
builder.Services.AddSqlsugarServer(); builder.Services.AddSqlsugarServer(DbFiterExtend.Data);
//builder.Services.AddSqlsugarServer(DbFiterExtend.Data);
#region #region
//Quartz<74><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Quartz<74><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#endregion #endregion

View File

@@ -27,6 +27,11 @@ namespace Yi.Framework.Core
return this.GetToken(_JWTTokenOptions.ReExpiration, user, null, true); return this.GetToken(_JWTTokenOptions.ReExpiration, user, null, true);
} }
public TimeSpan GetTokenExpiration()
{
return new TimeSpan(0, _JWTTokenOptions.Expiration, 0);
}
public string GetAccessToken(UserEntity user, HashSet<MenuEntity> menus) public string GetAccessToken(UserEntity user, HashSet<MenuEntity> menus)
{ {
return this.GetToken(_JWTTokenOptions.Expiration, user, menus); return this.GetToken(_JWTTokenOptions.Expiration, user, menus);

View File

@@ -21,7 +21,7 @@ namespace Yi.Framework.Core
} }
//无需授权情况 //无需授权情况
var userName = httpContext?.GetUserNameInfo(); var userName = httpContext?.GetUserIdInfo();
if (userName is null) if (userName is null)
{ {
return; return;
@@ -33,9 +33,10 @@ namespace Yi.Framework.Core
return; return;
} }
//这里可以优化一下 var userId = httpContext?.GetUserIdInfo();
//根据缓存获取全部用户信息 //根据缓存获取全部用户信息
var userRoleMenu = ServiceLocator.Instance?.GetService<CacheInvoker>()?.Get<UserRoleMenuDto>("用户id"); var userRoleMenu = ServiceLocator.Instance?.GetService<CacheInvoker>()?.Get<UserRoleMenuDto>($"Yi:UserInfo:{userId}");
var roles = userRoleMenu?.Roles; var roles = userRoleMenu?.Roles;
@@ -43,9 +44,8 @@ namespace Yi.Framework.Core
{ {
roles = new(); roles = new();
} }
//先测试部门就是LEBG
long deptId = userRoleMenu?.User.DeptId ?? -1; long deptId = userRoleMenu?.User.DeptId ?? -1;
long userId = httpContext?.GetUserIdInfo()??-1;
//根据角色的数据范围,来添加相对于的数据权限 //根据角色的数据范围,来添加相对于的数据权限
if (roles is not null) if (roles is not null)
{ {

View File

@@ -143,8 +143,8 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item v-if="form.id == undefined" label="用户名称" prop="userName"> <el-form-item v-if="form.id == undefined" label="用户账号" prop="userName">
<el-input v-model="form.user.userName" placeholder="请输入用户名称" maxlength="30" /> <el-input v-model="form.user.userName" placeholder="请输入用户账号" maxlength="30" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">