Merge pull request '🍓 refactor(Auth): 重命名Session,避免与传统Session概念混淆;权限变更时,清除相关用户状态信息' (#443) from jasondom/Admin.NET.Pro:v2 into v2
Reviewed-on: https://code.adminnet.top/Admin.NET/Admin.NET.Pro/pulls/443
This commit is contained in:
commit
82a7afb711
@ -214,7 +214,6 @@ public class AppAuthService : IDynamicApiController, ITransient
|
||||
if (string.IsNullOrWhiteSpace(_appUserManager.Account))
|
||||
throw Oops.Oh(ErrorCodeEnum.D1011);
|
||||
|
||||
_appUserManager.RemoveSession(_appUserManager.UserId);
|
||||
_httpContextAccessor.HttpContext.SignoutToSwagger();
|
||||
}
|
||||
|
||||
|
||||
@ -9,14 +9,14 @@ using Microsoft.AspNetCore.Http;
|
||||
namespace Admin.NET.Application;
|
||||
|
||||
/// <summary>
|
||||
/// 业务层用户Session管理
|
||||
/// 业务层用户状态管理
|
||||
/// </summary>
|
||||
/// <param name="sysCacheService"></param>
|
||||
/// <param name="httpContextAccessor"></param>
|
||||
public class AppUserManager(
|
||||
SysCacheService sysCacheService,
|
||||
IHttpContextAccessor httpContextAccessor)
|
||||
: UserManager(sysCacheService, httpContextAccessor), IUserSessionExtProps
|
||||
: UserManager(sysCacheService, httpContextAccessor), IUserManagerExtProps
|
||||
{
|
||||
/// <summary>
|
||||
/// 工号
|
||||
|
||||
@ -48,8 +48,8 @@ public class ApiKeyAuthenticationHandler : AuthenticationHandler<ApiKeyAuthentic
|
||||
new Claim(ClaimConst.TokenVersion, "1")
|
||||
]);
|
||||
|
||||
// 设置用户Session缓存
|
||||
if (!_userManager.ExistSession(acsInfo.Id)) await _sysAuthService.CreateToken(acsInfo.BindUser);
|
||||
// 设置用户状态缓存
|
||||
if (!_userManager.Exist(acsInfo.Id)) await _sysAuthService.CreateToken(acsInfo.BindUser);
|
||||
|
||||
var user = new ClaimsPrincipal(identity);
|
||||
return AuthenticateResult.Success(new AuthenticationTicket(user, AuthenticationScheme));
|
||||
|
||||
@ -19,7 +19,7 @@ public class CacheConst
|
||||
/// <summary>
|
||||
/// 用户会话缓存
|
||||
/// </summary>
|
||||
public const string KeyUserSession = "sys_user_session:";
|
||||
public const string KeyUserManager = "sys_user_manager:";
|
||||
|
||||
/// <summary>
|
||||
/// 用户Token版本缓存
|
||||
|
||||
@ -197,19 +197,19 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter, IDisposable
|
||||
.GetValueOrDefault(ClaimConst.UserId) ?? ""
|
||||
, out var temp) ? temp : null;
|
||||
|
||||
var userSession = userManger.GetSession(result.UserId);
|
||||
result.TenantId = long.TryParse(userSession?.TenantId?.ToString() ?? "", out temp) ? temp : null;
|
||||
result.RealName = userSession?.RealName;
|
||||
result.Account = userSession?.Account;
|
||||
var userManager = userManger.Get(result.UserId);
|
||||
result.TenantId = long.TryParse(userManager?.TenantId?.ToString() ?? "", out temp) ? temp : null;
|
||||
result.RealName = userManager?.RealName;
|
||||
result.Account = userManager?.Account;
|
||||
}
|
||||
|
||||
// 退出登陆时没有session,尝试从数据库中获取
|
||||
// 退出登陆时没有用户状态,尝试从userManger中获取
|
||||
if (string.IsNullOrWhiteSpace(result.Account) && result.UserId != null)
|
||||
{
|
||||
var user = _db.Queryable<SysUser>().First(u => u.Id == result.UserId);
|
||||
result.Account = user?.TenantId?.ToString();
|
||||
result.RealName = user?.RealName;
|
||||
result.Account = user?.Account;
|
||||
var userManager = userManger.GetOrRefresh(result.UserId);
|
||||
result.Account =userManager?.TenantId?.ToString();
|
||||
result.RealName = userManager?.RealName;
|
||||
result.Account = userManager?.Account;
|
||||
}
|
||||
|
||||
// 用户登陆时没有userId,需要根据入参获取
|
||||
|
||||
@ -46,17 +46,17 @@ public class ElasticSearchLoggingWriter : IDatabaseLoggingWriter, IDisposable
|
||||
string account = "", realName = "", userId = "", tenantId = "";
|
||||
if (loggingMonitor.authorizationClaims != null)
|
||||
{
|
||||
UserSessionDao userSession = null;
|
||||
UserManagerDao manager = null;
|
||||
foreach (var item in loggingMonitor.authorizationClaims)
|
||||
{
|
||||
if (item.type != ClaimConst.UserId) continue;
|
||||
userId = item.value;
|
||||
userSession = userManager.Value.GetSessionOrRefresh(userId);
|
||||
manager = userManager.Value.GetOrRefresh(userId);
|
||||
break;
|
||||
}
|
||||
tenantId = userSession?.TenantId.ToString();
|
||||
realName = userSession?.RealName;
|
||||
account = userSession?.Account;
|
||||
tenantId = manager?.TenantId.ToString();
|
||||
realName = manager?.RealName;
|
||||
account = manager?.Account;
|
||||
}
|
||||
|
||||
string remoteIPv4 = loggingMonitor.remoteIPv4;
|
||||
|
||||
@ -273,8 +273,8 @@ public class SysAuthService : IDynamicApiController, ITransient
|
||||
// 发布系统登录事件
|
||||
await _eventPublisher.PublishAsync(UserEventTypeEnum.Login, user);
|
||||
|
||||
// 缓存用户Session
|
||||
await SetUserSession(user, loginMode);
|
||||
// 缓存用户状态
|
||||
await SetUserManager(user, loginMode);
|
||||
|
||||
return new LoginOutput
|
||||
{
|
||||
@ -284,11 +284,11 @@ public class SysAuthService : IDynamicApiController, ITransient
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置用户Session
|
||||
/// 设置用户状态
|
||||
/// </summary>
|
||||
/// <param name="user"></param>
|
||||
/// <param name="loginMode"></param>
|
||||
private async Task SetUserSession(SysUser user, LoginModeEnum loginMode = LoginModeEnum.PC)
|
||||
private async Task SetUserManager(SysUser user, LoginModeEnum loginMode = LoginModeEnum.PC)
|
||||
{
|
||||
var db = _sysUserRep.Context.CopyNew();
|
||||
user.SysPos ??= await db.Queryable<SysPos>().FirstAsync(u => u.Id == user.PosId);
|
||||
@ -305,8 +305,8 @@ public class SysAuthService : IDynamicApiController, ITransient
|
||||
var permissions = GetUserPermissions(user, roleIds);
|
||||
var unauthorizedPermissions = GetUserUnPermissions(user, roleIds);
|
||||
|
||||
// 缓存用户Session
|
||||
_userManager.SetSession(new()
|
||||
// 缓存用户状态
|
||||
_userManager.Set(new()
|
||||
{
|
||||
UserId = user.Id,
|
||||
TenantId = user.TenantId,
|
||||
@ -331,7 +331,7 @@ public class SysAuthService : IDynamicApiController, ITransient
|
||||
UnauthorizedPermissions = unauthorizedPermissions,
|
||||
DataScopeList = user.AccountType == AccountTypeEnum.SuperAdmin ? [DataScopeEnum.All] : maxDataScope,
|
||||
AppPermissions = loginMode == LoginModeEnum.APP ? LazyHelper.GetService<SysCommonService>().Value.GetAppApiList() : null,
|
||||
ExtProps = App.GetServices<IUserSessionExtProps>().SelectMany(u => u.GetInitExtProps(user)).ToDictionary(u => u.Key, u => u.Value)
|
||||
ExtProps = App.GetServices<IUserManagerExtProps>().SelectMany(u => u.GetInitExtProps(user)).ToDictionary(u => u.Key, u => u.Value)
|
||||
});
|
||||
}
|
||||
|
||||
@ -412,7 +412,6 @@ public class SysAuthService : IDynamicApiController, ITransient
|
||||
|
||||
// 发布系统退出事件
|
||||
await _eventPublisher.PublishAsync(UserEventTypeEnum.Logout, _userManager);
|
||||
_userManager.RemoveSession(_userManager.UserId);
|
||||
|
||||
// 退出Swagger/设置无效Token响应头
|
||||
_httpContextAccessor.HttpContext.SignoutToSwagger();
|
||||
@ -622,7 +621,7 @@ public class SysAuthService : IDynamicApiController, ITransient
|
||||
if (dataScopes.All(u => u != DataScopeEnum.All) && dataScopes.Any(u => u == DataScopeEnum.DeptChild))
|
||||
{
|
||||
var childOrg = db.Queryable<SysOrg>().IgnoreTenant().ToTree(u => u.Children, u => u.Pid, user.OrgId);
|
||||
if (childOrg == null || childOrg.Count > 0) return orgIds;
|
||||
if (childOrg is not { Count: > 0 }) return orgIds;
|
||||
var queue = new Queue<SysOrg>(childOrg);
|
||||
while (queue.Count > 0)
|
||||
{
|
||||
@ -635,13 +634,13 @@ public class SysAuthService : IDynamicApiController, ITransient
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 刷新Session
|
||||
/// 刷新用户状态
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
[NonAction]
|
||||
public async Task RefreshSession(long userId)
|
||||
public async Task RefreshUserManager(long userId)
|
||||
{
|
||||
var user = await _sysUserRep.AsQueryable().IgnoreTenant().Includes(u => u.SysOrg).FirstAsync(u => u.Id == userId);
|
||||
await SetUserSession(user, CommonHelper.IsMobile(_httpContextAccessor.HttpContext?.Request.Headers.UserAgent ?? "") ? LoginModeEnum.APP : LoginModeEnum.PC);
|
||||
await SetUserManager(user, CommonHelper.IsMobile(_httpContextAccessor.HttpContext?.Request.Headers.UserAgent ?? "") ? LoginModeEnum.APP : LoginModeEnum.PC);
|
||||
}
|
||||
}
|
||||
@ -439,10 +439,10 @@ public class SysCacheService : IDynamicApiController, ISingleton
|
||||
return;
|
||||
}
|
||||
|
||||
// 排除非本租户、以及超管的Session缓存
|
||||
// 排除非本租户、以及超管的 用户状态 缓存
|
||||
var sysUserRep = App.GetService<SqlSugarRepository<SysUser>>();
|
||||
var userIds = sysUserRep.AsQueryable().Where(u => u.AccountType != AccountTypeEnum.SuperAdmin).Select(u => u.Id).ToList().Select(u => u.ToString()).ToList();
|
||||
var keys = _cacheProvider.Cache.Keys.Where(key => !key.StartsWith(CacheConst.KeyUserSession) || userIds.Any(key.EndsWith)).ToList();
|
||||
var keys = _cacheProvider.Cache.Keys.Where(key => !key.StartsWith(CacheConst.KeyUserManager) || userIds.Any(key.EndsWith)).ToList();
|
||||
keys.ForEach(key => _cacheProvider.Cache.Remove(key));
|
||||
}
|
||||
|
||||
|
||||
@ -603,7 +603,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
|
||||
await _db.Insertable(menus).ExecuteCommandAsync();
|
||||
|
||||
// 删除角色菜单按钮缓存
|
||||
_sysCacheService.RemoveByPrefixKey(CacheConst.KeyUserSession);
|
||||
_sysCacheService.RemoveByPrefixKey(CacheConst.KeyUserManager);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -139,6 +139,9 @@ public class SysMenuService : IDynamicApiController, ITransient
|
||||
var newMenuId = await _sysMenuRep.InsertReturnSnowflakeIdAsync(sysMenu);
|
||||
// 将新增的菜单Id增加到当前账号角色菜单集合
|
||||
await AddRoleMenuId(newMenuId);
|
||||
|
||||
// 菜单按钮增加了权限标识,全部用户状态都需要更新
|
||||
if (input.Type == MenuTypeEnum.Btn) LazyHelper.GetService<UserManager>().Value.RemoveAll();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -150,31 +153,33 @@ public class SysMenuService : IDynamicApiController, ITransient
|
||||
[DisplayName("更新菜单")]
|
||||
public async Task UpdateMenu(UpdateMenuInput input)
|
||||
{
|
||||
if (input.Id == input.Pid)
|
||||
throw Oops.Oh(ErrorCodeEnum.D4008);
|
||||
if (input.Id == input.Pid) throw Oops.Oh(ErrorCodeEnum.D4008);
|
||||
|
||||
var isExist = input.Type != MenuTypeEnum.Btn
|
||||
? await _sysMenuRep.IsAnyAsync(u => u.Title == input.Title && u.Type == input.Type && u.Pid == input.Pid && u.Id != input.Id)
|
||||
: await _sysMenuRep.IsAnyAsync(u => u.Pid == input.Pid && u.Permission == input.Permission && u.Id != input.Id);
|
||||
if (isExist)
|
||||
throw Oops.Oh(ErrorCodeEnum.D4000);
|
||||
if (isExist) throw Oops.Oh(ErrorCodeEnum.D4000);
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(input.Name))
|
||||
{
|
||||
if (await _sysMenuRep.IsAnyAsync(u => u.Id != input.Id && u.Name == input.Name))
|
||||
throw Oops.Oh(ErrorCodeEnum.D4009);
|
||||
if (await _sysMenuRep.IsAnyAsync(u => u.Id != input.Id && u.Name == input.Name)) throw Oops.Oh(ErrorCodeEnum.D4009);
|
||||
}
|
||||
|
||||
if (input.Pid != 0)
|
||||
{
|
||||
if (await _sysMenuRep.IsAnyAsync(u => u.Id == input.Pid && u.Type == MenuTypeEnum.Btn))
|
||||
throw Oops.Oh(ErrorCodeEnum.D4010);
|
||||
if (await _sysMenuRep.IsAnyAsync(u => u.Id == input.Pid && u.Type == MenuTypeEnum.Btn)) throw Oops.Oh(ErrorCodeEnum.D4010);
|
||||
}
|
||||
|
||||
// 校验菜单参数
|
||||
var sysMenu = input.Adapt<SysMenu>();
|
||||
CheckMenuParam(sysMenu);
|
||||
|
||||
// 菜单按钮增加了权限标识,全部用户状态都需要更新
|
||||
if (input.Type == MenuTypeEnum.Btn || await _sysMenuRep.IsAnyAsync(u => u.Id == input.Id && u.Type == MenuTypeEnum.Btn))
|
||||
{
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveAll();
|
||||
}
|
||||
|
||||
await _sysMenuRep.AsUpdateable(sysMenu).ExecuteCommandAsync();
|
||||
}
|
||||
|
||||
@ -198,6 +203,9 @@ public class SysMenuService : IDynamicApiController, ITransient
|
||||
|
||||
// 级联删除用户收藏菜单
|
||||
await _sysUserMenuService.DeleteMenuList(menuIdList);
|
||||
|
||||
// 删除菜单全部数据都需要更新
|
||||
if (menuTreeList.Any(u => u.Type == MenuTypeEnum.Btn)) LazyHelper.GetService<UserManager>().Value.RemoveAll();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -206,11 +214,11 @@ public class SysMenuService : IDynamicApiController, ITransient
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[DisplayName("设置菜单状态")]
|
||||
public async Task<int> SetStatus(BaseStatusInput input)
|
||||
public async Task<bool> SetStatus(BaseStatusInput input)
|
||||
{
|
||||
var menu = await _sysMenuRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
|
||||
menu.Status = input.Status;
|
||||
return await _sysMenuRep.AsUpdateable(menu).UpdateColumns(u => new { u.Status }).ExecuteCommandAsync();
|
||||
if (menu.Type == MenuTypeEnum.Btn) LazyHelper.GetService<UserManager>().Value.RemoveAll();
|
||||
return await _sysMenuRep.UpdateAsync(u => new() { Status = input.Status }, u => u.Id == input.Id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -261,8 +269,7 @@ public class SysMenuService : IDynamicApiController, ITransient
|
||||
private async Task AddRoleMenuId(long menuId)
|
||||
{
|
||||
if (_userManager.SuperAdmin) return;
|
||||
|
||||
var roleIdList = await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
|
||||
await _sysRoleMenuService.GrantRoleMenu(new RoleMenuInput() { Id = roleIdList[0], MenuIdList = [menuId] }, false);
|
||||
await _sysRoleMenuService.GrantRoleMenu(new RoleMenuInput { Id = _userManager.RoleIds[0], MenuIdList = [menuId] }, false);
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([_userManager.RoleIds[0]]);
|
||||
}
|
||||
}
|
||||
@ -169,9 +169,9 @@ public class SysOpenAccessService : IDynamicApiController, ITransient
|
||||
/// <param name="openAccess"></param>
|
||||
/// <returns></returns>
|
||||
[NonAction]
|
||||
private async Task TryCreateSession(SysOpenAccess openAccess)
|
||||
private async Task TryRefreshUserManager(SysOpenAccess openAccess)
|
||||
{
|
||||
if (!_userManager.ExistSession(openAccess.Id)) await _sysAuthService.CreateToken(openAccess.BindUser);
|
||||
if (!_userManager.Exist(openAccess.BindUser.Id)) await _sysAuthService.RefreshUserManager(openAccess.BindUser.Id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -208,7 +208,7 @@ public class SysOpenAccessService : IDynamicApiController, ITransient
|
||||
new Claim(ClaimConst.UserId, openAccess.BindUserId + ""),
|
||||
new Claim(ClaimConst.TokenVersion, openAccess.BindUser.TokenVersion + ""),
|
||||
]);
|
||||
openAccessService.TryCreateSession(openAccess).GetAwaiter().GetResult();
|
||||
openAccessService.TryRefreshUserManager(openAccess).GetAwaiter().GetResult();
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
};
|
||||
|
||||
@ -132,15 +132,15 @@ public class SysOrgService : IDynamicApiController, ITransient
|
||||
}
|
||||
|
||||
// 删除与此父机构有关的用户机构缓存
|
||||
var userManager = LazyHelper.GetService<UserManager>().Value;
|
||||
if (input.Pid == 0)
|
||||
{
|
||||
DeleteAllUserOrgCache(0, 0);
|
||||
userManager.RemoveAll();
|
||||
}
|
||||
else
|
||||
{
|
||||
var pOrg = await _sysOrgRep.GetByIdAsync(input.Pid);
|
||||
if (pOrg != null)
|
||||
DeleteAllUserOrgCache(pOrg.Id, pOrg.Pid);
|
||||
if (pOrg != null) userManager.RemoveByOrgId([pOrg.Id, input.Pid]);
|
||||
}
|
||||
|
||||
var newOrg = await _sysOrgRep.AsInsertable(input.Adapt<SysOrg>()).ExecuteReturnEntityAsync();
|
||||
@ -158,6 +158,7 @@ public class SysOrgService : IDynamicApiController, ITransient
|
||||
DeleteAllUserOrgCache(0, 0);
|
||||
await _sysOrgRep.AsDeleteable().ExecuteCommandAsync();
|
||||
await _sysOrgRep.AsInsertable(orgs).ExecuteCommandAsync();
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveAll();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -170,42 +171,30 @@ public class SysOrgService : IDynamicApiController, ITransient
|
||||
[DisplayName("更新机构")]
|
||||
public async Task UpdateOrg(UpdateOrgInput input)
|
||||
{
|
||||
if (!_userManager.SuperAdmin && input.Pid == 0)
|
||||
throw Oops.Oh(ErrorCodeEnum.D2010);
|
||||
if (!_userManager.SuperAdmin && input.Pid == 0) throw Oops.Oh(ErrorCodeEnum.D2010);
|
||||
if (input.Id == input.Pid) throw Oops.Oh(ErrorCodeEnum.D2001);
|
||||
|
||||
if (input.Pid != 0)
|
||||
{
|
||||
//var pOrg = await _sysOrgRep.GetByIdAsync(input.Pid);
|
||||
//_ = pOrg ?? throw Oops.Oh(ErrorCodeEnum.D2000);
|
||||
|
||||
// 若父机构发生变化则清空用户机构缓存
|
||||
var sysOrg = await _sysOrgRep.GetByIdAsync(input.Id);
|
||||
if (sysOrg != null && sysOrg.Pid != input.Pid)
|
||||
{
|
||||
// 删除与此机构、新父机构有关的用户机构缓存
|
||||
DeleteAllUserOrgCache(sysOrg.Id, input.Pid);
|
||||
}
|
||||
}
|
||||
if (input.Id == input.Pid)
|
||||
throw Oops.Oh(ErrorCodeEnum.D2001);
|
||||
|
||||
if (await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id))
|
||||
throw Oops.Oh(ErrorCodeEnum.D2002);
|
||||
if (await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id)) throw Oops.Oh(ErrorCodeEnum.D2002);
|
||||
|
||||
// 父Id不能为自己的子节点
|
||||
var childIdList = await GetChildIdListWithSelfById(input.Id);
|
||||
if (childIdList.Contains(input.Pid))
|
||||
throw Oops.Oh(ErrorCodeEnum.D2001);
|
||||
if (childIdList.Contains(input.Pid)) throw Oops.Oh(ErrorCodeEnum.D2001);
|
||||
|
||||
// 是否有权限操作此机构
|
||||
if (!_userManager.SuperAdmin)
|
||||
{
|
||||
var orgIdList = await GetUserOrgIdList();
|
||||
if (orgIdList.Count < 1 || !orgIdList.Contains(input.Id))
|
||||
throw Oops.Oh(ErrorCodeEnum.D2003);
|
||||
var orgIdList = _userManager.OrgIds;
|
||||
if (orgIdList.Count < 1 || !orgIdList.Contains(input.Id)) throw Oops.Oh(ErrorCodeEnum.D2003);
|
||||
}
|
||||
|
||||
await _sysOrgRep.AsUpdateable(input.Adapt<SysOrg>()).IgnoreColumns(true).ExecuteCommandAsync();
|
||||
|
||||
if (input.Pid != 0)
|
||||
{
|
||||
// 若父机构发生变化则清空用户机构缓存
|
||||
var sysOrg = await _sysOrgRep.GetByIdAsync(input.Id);
|
||||
if (sysOrg != null && sysOrg.Pid != input.Pid) LazyHelper.GetService<UserManager>().Value.RemoveByOrgId([input.Pid, input.Id]);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -224,26 +213,22 @@ public class SysOrgService : IDynamicApiController, ITransient
|
||||
if (!_userManager.SuperAdmin)
|
||||
{
|
||||
var orgIdList = await GetUserOrgIdList();
|
||||
if (orgIdList.Count < 1 || !orgIdList.Contains(sysOrg.Id))
|
||||
throw Oops.Oh(ErrorCodeEnum.D2003);
|
||||
if (orgIdList.Count < 1 || !orgIdList.Contains(sysOrg.Id)) throw Oops.Oh(ErrorCodeEnum.D2003);
|
||||
}
|
||||
|
||||
// 若机构为租户默认机构禁止删除
|
||||
var isTenantOrg = await _sysOrgRep.ChangeRepository<SqlSugarRepository<SysTenant>>()
|
||||
.IsAnyAsync(u => u.OrgId == input.Id);
|
||||
if (isTenantOrg)
|
||||
throw Oops.Oh(ErrorCodeEnum.D2008);
|
||||
if (isTenantOrg) throw Oops.Oh(ErrorCodeEnum.D2008);
|
||||
|
||||
// 若机构有用户则禁止删除
|
||||
var orgHasEmp = await _sysOrgRep.ChangeRepository<SqlSugarRepository<SysUser>>()
|
||||
.IsAnyAsync(u => u.OrgId == input.Id);
|
||||
if (orgHasEmp)
|
||||
throw Oops.Oh(ErrorCodeEnum.D2004);
|
||||
if (orgHasEmp) throw Oops.Oh(ErrorCodeEnum.D2004);
|
||||
|
||||
// 若扩展机构有用户则禁止删除
|
||||
var hasExtOrgEmp = await _sysUserExtOrgService.HasUserOrg(sysOrg.Id);
|
||||
if (hasExtOrgEmp)
|
||||
throw Oops.Oh(ErrorCodeEnum.D2005);
|
||||
if (hasExtOrgEmp) throw Oops.Oh(ErrorCodeEnum.D2005);
|
||||
|
||||
// 若子机构有用户则禁止删除
|
||||
var childOrgTreeList = await _sysOrgRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true);
|
||||
@ -252,8 +237,7 @@ public class SysOrgService : IDynamicApiController, ITransient
|
||||
// 若子机构有用户则禁止删除
|
||||
var cOrgHasEmp = await _sysOrgRep.ChangeRepository<SqlSugarRepository<SysUser>>()
|
||||
.IsAnyAsync(u => childOrgIdList.Contains(u.OrgId));
|
||||
if (cOrgHasEmp)
|
||||
throw Oops.Oh(ErrorCodeEnum.D2007);
|
||||
if (cOrgHasEmp) throw Oops.Oh(ErrorCodeEnum.D2007);
|
||||
|
||||
// 删除与此机构、父机构有关的用户机构缓存
|
||||
DeleteAllUserOrgCache(sysOrg.Id, sysOrg.Pid);
|
||||
@ -266,6 +250,8 @@ public class SysOrgService : IDynamicApiController, ITransient
|
||||
|
||||
// 级联删除用户机构数据
|
||||
await _sysUserExtOrgService.DeleteUserExtOrgByOrgIdList(childOrgIdList);
|
||||
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByOrgId([sysOrg.Pid, sysOrg.Id]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -343,26 +329,6 @@ public class SysOrgService : IDynamicApiController, ITransient
|
||||
return await GetUserOrgIdList(roleList, userId, userOrgId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判定用户是否有某角色权限
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="role">角色代码</param>
|
||||
/// <returns></returns>
|
||||
[NonAction]
|
||||
public async Task<bool> GetUserHasRole(long userId, SysRole role)
|
||||
{
|
||||
if (_userManager.SuperAdmin) return true;
|
||||
|
||||
var userOrgId = _userManager.OrgId;
|
||||
var roleList = await _sysUserRoleService.GetUserRoleList(userId);
|
||||
if (roleList != null && roleList.Exists(r => r.Code == role.Code)) return true;
|
||||
|
||||
roleList = [role];
|
||||
var orgIds = await GetUserOrgIdList(roleList, userId, userOrgId);
|
||||
return orgIds.Contains(userOrgId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据角色Id集合获取机构Id集合
|
||||
/// </summary>
|
||||
@ -400,8 +366,8 @@ public class SysOrgService : IDynamicApiController, ITransient
|
||||
});
|
||||
}
|
||||
|
||||
// 缓存当前用户最大角色数据范围
|
||||
_sysCacheService.Set(CacheConst.KeyRoleMaxDataScope + userId, strongerDataScopeType, TimeSpan.FromDays(7));
|
||||
// // 缓存当前用户最大角色数据范围
|
||||
// _sysCacheService.Set(CacheConst.KeyRoleMaxDataScope + userId, strongerDataScopeType, TimeSpan.FromDays(7));
|
||||
|
||||
// 根据角色集合获取机构集合
|
||||
var roleOrgIdList = await _sysRoleOrgService.GetRoleOrgIdList(customDataScopeRoleIdList);
|
||||
|
||||
@ -78,7 +78,6 @@ public class SysPosService : IDynamicApiController, ITransient
|
||||
public async Task AddPos(AddPosInput input)
|
||||
{
|
||||
if (await _sysPosRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code)) throw Oops.Oh(ErrorCodeEnum.D6000);
|
||||
|
||||
await _sysPosRep.InsertAsync(input.Adapt<SysPos>());
|
||||
}
|
||||
|
||||
@ -97,6 +96,7 @@ public class SysPosService : IDynamicApiController, ITransient
|
||||
if (!_userManager.SuperAdmin && sysPos.CreateUserId != _userManager.UserId) throw Oops.Oh(ErrorCodeEnum.D6002);
|
||||
|
||||
await _sysPosRep.AsUpdateable(input.Adapt<SysPos>()).IgnoreColumns(true).ExecuteCommandAsync();
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByPosId([input.Id]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -121,6 +121,7 @@ public class SysPosService : IDynamicApiController, ITransient
|
||||
if (hasExtPosEmp) throw Oops.Oh(ErrorCodeEnum.D6001);
|
||||
|
||||
await _sysPosRep.DeleteByIdAsync(input.Id);
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByPosId([input.Id]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -11,6 +11,7 @@ public class RoleInput : BaseIdInput
|
||||
/// <summary>
|
||||
/// 状态
|
||||
/// </summary>
|
||||
[Enum]
|
||||
public virtual StatusEnum Status { get; set; }
|
||||
}
|
||||
|
||||
|
||||
@ -36,6 +36,7 @@ public class SysRoleApiService : ITransient
|
||||
Route = u
|
||||
}).ToList();
|
||||
await _sysRoleApiRep.InsertRangeAsync(roleApis);
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -58,6 +59,7 @@ public class SysRoleApiService : ITransient
|
||||
public async Task DeleteRoleApiByRoleId(long roleId)
|
||||
{
|
||||
await _sysRoleApiRep.DeleteAsync(u => u.RoleId == roleId);
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([roleId]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -75,5 +77,6 @@ public class SysRoleApiService : ITransient
|
||||
u.RoleId = newRoleId;
|
||||
});
|
||||
await _sysRoleApiRep.InsertRangeAsync(roleApiList);
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([newRoleId]);
|
||||
}
|
||||
}
|
||||
@ -47,6 +47,7 @@ public class SysRoleMenuService : ITransient
|
||||
MenuId = u
|
||||
}).ToList();
|
||||
await _sysRoleMenuRep.InsertRangeAsync(menus);
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -56,7 +57,9 @@ public class SysRoleMenuService : ITransient
|
||||
/// <returns></returns>
|
||||
public async Task DeleteRoleMenuByMenuIdList(List<long> menuIdList)
|
||||
{
|
||||
var roleIds = await _sysRoleMenuRep.AsQueryable().Where(u => menuIdList.Contains(u.MenuId)).Select(u => u.RoleId).Distinct().ToListAsync();
|
||||
await _sysRoleMenuRep.DeleteAsync(u => menuIdList.Contains(u.MenuId));
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId(roleIds);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -67,6 +70,7 @@ public class SysRoleMenuService : ITransient
|
||||
public async Task DeleteRoleMenuByRoleId(long roleId)
|
||||
{
|
||||
await _sysRoleMenuRep.DeleteAsync(u => u.RoleId == roleId);
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([roleId]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -84,5 +88,6 @@ public class SysRoleMenuService : ITransient
|
||||
u.RoleId = newRoleId;
|
||||
});
|
||||
await _sysRoleMenuRep.InsertRangeAsync(roleMenuList);
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([newRoleId]);
|
||||
}
|
||||
}
|
||||
@ -35,6 +35,7 @@ public class SysRoleOrgService : ITransient
|
||||
}).ToList();
|
||||
await _sysRoleOrgRep.InsertRangeAsync(roleOrgList);
|
||||
}
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -50,7 +51,7 @@ public class SysRoleOrgService : ITransient
|
||||
.Where(u => roleIdList.Contains(u.RoleId))
|
||||
.Select(u => u.OrgId).ToListAsync();
|
||||
}
|
||||
else return new List<long>();
|
||||
return new List<long>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -60,7 +61,9 @@ public class SysRoleOrgService : ITransient
|
||||
/// <returns></returns>
|
||||
public async Task DeleteRoleOrgByOrgIdList(List<long> orgIdList)
|
||||
{
|
||||
var roleIdList = await _sysRoleOrgRep.AsQueryable().Where(u => orgIdList.Contains(u.OrgId)).Select(u => u.RoleId).Distinct().ToListAsync();
|
||||
await _sysRoleOrgRep.DeleteAsync(u => orgIdList.Contains(u.OrgId));
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId(roleIdList);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -71,6 +74,7 @@ public class SysRoleOrgService : ITransient
|
||||
public async Task DeleteRoleOrgByRoleId(long roleId)
|
||||
{
|
||||
await _sysRoleOrgRep.DeleteAsync(u => u.RoleId == roleId);
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([roleId]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -88,5 +92,8 @@ public class SysRoleOrgService : ITransient
|
||||
u.RoleId = newRoleId;
|
||||
});
|
||||
await _sysRoleOrgRep.InsertRangeAsync(roleOrgList);
|
||||
|
||||
// 清除关联用户状态
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([newRoleId]);
|
||||
}
|
||||
}
|
||||
@ -126,6 +126,8 @@ public class SysRoleService : IDynamicApiController, ITransient
|
||||
|
||||
await _sysRoleRep.AsUpdateable(input.Adapt<SysRole>()).IgnoreColumns(true)
|
||||
.IgnoreColumns(u => new { u.DataScope }).ExecuteCommandAsync();
|
||||
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -162,6 +164,9 @@ public class SysRoleService : IDynamicApiController, ITransient
|
||||
|
||||
// 级联删除角色表格数据
|
||||
await _sysRoleTableService.DeleteRolTableByRoleId(sysRole.Id);
|
||||
|
||||
// 删除关联的用户状态
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -201,6 +206,9 @@ public class SysRoleService : IDynamicApiController, ITransient
|
||||
|
||||
// 复制角色表格数据
|
||||
await _sysRoleTableService.CopyRolTableByRoleId(input.Id, newRoleId);
|
||||
|
||||
// 清除关联用户状态
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([newRoleId]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -213,18 +221,8 @@ public class SysRoleService : IDynamicApiController, ITransient
|
||||
{
|
||||
if (input.MenuIdList == null || input.MenuIdList.Count < 1) return;
|
||||
|
||||
//// 将父节点为0的菜单排除,防止前端全选异常
|
||||
//var pMenuIds = await _sysRoleRep.ChangeRepository<SqlSugarRepository<SysMenu>>().AsQueryable().Where(u => input.MenuIdList.Contains(u.Id) && u.Pid == 0).ToListAsync(u => u.Id);
|
||||
//var menuIds = input.MenuIdList.Except(pMenuIds); // 差集
|
||||
//await _sysRoleMenuService.GrantRoleMenu(new RoleMenuInput()
|
||||
//{
|
||||
// Id = input.Id,
|
||||
// MenuIdList = menuIds.ToList()
|
||||
//});
|
||||
|
||||
await _sysRoleMenuService.GrantRoleMenu(input);
|
||||
|
||||
await ClearUserApiCache(input.Id);
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -269,7 +267,7 @@ public class SysRoleService : IDynamicApiController, ITransient
|
||||
var grantOrgIdList = input.OrgIdList;
|
||||
if (grantOrgIdList.Count > 0)
|
||||
{
|
||||
var orgIdList = await _sysOrgService.GetUserOrgIdList();
|
||||
var orgIdList = _userManager.OrgIds;
|
||||
if (orgIdList.Count < 1) throw Oops.Oh(ErrorCodeEnum.D1016);
|
||||
if (!grantOrgIdList.All(u => orgIdList.Any(c => c == u))) throw Oops.Oh(ErrorCodeEnum.D1016);
|
||||
}
|
||||
@ -285,6 +283,8 @@ public class SysRoleService : IDynamicApiController, ITransient
|
||||
role.DataScope = (DataScopeEnum)dataScope;
|
||||
await _sysRoleRep.AsUpdateable(role).UpdateColumns(u => new { u.DataScope }).ExecuteCommandAsync();
|
||||
await _sysRoleOrgService.GrantRoleOrg(input);
|
||||
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -296,8 +296,8 @@ public class SysRoleService : IDynamicApiController, ITransient
|
||||
[DisplayName("授权角色接口")]
|
||||
public async Task GrantApi(RoleApiInput input)
|
||||
{
|
||||
await ClearUserApiCache(input.Id);
|
||||
await _sysRoleApiService.GrantRoleApi(input);
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -310,6 +310,10 @@ public class SysRoleService : IDynamicApiController, ITransient
|
||||
public async Task GrantUser(RoleUserInput input)
|
||||
{
|
||||
await _sysUserRoleService.GrantRoleUser(input);
|
||||
|
||||
// 清除关联用户状态
|
||||
var userManager = LazyHelper.GetService<UserManager>().Value;
|
||||
foreach (var userId in input.UserIdList) userManager.Remove(userId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -322,10 +326,15 @@ public class SysRoleService : IDynamicApiController, ITransient
|
||||
{
|
||||
if (!Enum.IsDefined(input.Status)) throw Oops.Oh(ErrorCodeEnum.D3005);
|
||||
|
||||
return await _sysRoleRep.AsUpdateable()
|
||||
.SetColumns(u => u.Status == input.Status)
|
||||
var result = await _sysRoleRep.AsUpdateable()
|
||||
.SetColumns(u => u.Status, input.Status)
|
||||
.Where(u => u.Id == input.Id)
|
||||
.ExecuteCommandAsync();
|
||||
|
||||
// 清除关联用户状态
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -390,101 +399,8 @@ public class SysRoleService : IDynamicApiController, ITransient
|
||||
public async Task<List<string>> GetRoleApiList([FromQuery] RoleInput input)
|
||||
{
|
||||
return await _sysRoleApiService.GetRoleApiList(new List<long> { input.Id });
|
||||
|
||||
//var roleButtons = await GetRoleButtonList(new List<long> { input.Id });
|
||||
//return roleApis.Union(roleButtons).ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取用户接口集合
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
[NonAction]
|
||||
public async Task<List<string>> GetUserApiList(long userId)
|
||||
{
|
||||
List<string> apiList = [];
|
||||
// 超管账号获取所有接口
|
||||
if (await _sysRoleRep.Context.Queryable<SysUser>().IgnoreTenant().AnyAsync(u => u.Id == userId && u.AccountType == AccountTypeEnum.SuperAdmin))
|
||||
{
|
||||
// 获取所有接口
|
||||
var queue = new Queue<ApiOutput>(_sysCommonService.GetApiList());
|
||||
var item = queue.Dequeue();
|
||||
while (item != null)
|
||||
{
|
||||
if (item.Children is { Count: > 0 }) queue.EnqueueRange(item.Children);
|
||||
else apiList.Add(item.Route);
|
||||
item = queue.Count > 0 ? queue.Dequeue() : null;
|
||||
}
|
||||
var allButtonList = await GetButtonList();
|
||||
apiList.AddRange(allButtonList);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 获取账号所有权限集
|
||||
var menuIdList = await _sysRoleMenuService.GetRoleMenuIdList(await _sysUserRoleService.GetUserRoleIdList(userId));
|
||||
apiList = await GetButtonList(menuIdList, false);
|
||||
}
|
||||
apiList = apiList.Distinct().ToList();
|
||||
apiList.Sort();
|
||||
return apiList;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取无权访问接口集合 🔖
|
||||
/// </summary>
|
||||
[NonAction]
|
||||
public async Task<List<string>> GetUnAuthApiList(long userId)
|
||||
{
|
||||
if (await _sysRoleRep.Context.Queryable<SysUser>().IgnoreTenant().AnyAsync(u => u.Id == userId && u.AccountType == AccountTypeEnum.SuperAdmin)) return [];
|
||||
|
||||
// 所有按钮权限集合
|
||||
var allButtonList = await GetButtonList();
|
||||
|
||||
// 当前账号所有角色集合
|
||||
var roleIds = await _sysUserRoleService.GetUserRoleIdList(userId);
|
||||
|
||||
// 菜单中已有的权限集与当前用户的权限集差集,就是无权访问的权限集
|
||||
var menuIdList = await _sysRoleMenuService.GetRoleMenuIdList(roleIds);
|
||||
var apiList = await GetButtonList(menuIdList, false);
|
||||
var blackList = allButtonList.Except(apiList).ToList(); // 差集
|
||||
|
||||
// 角色接口黑名单集合
|
||||
blackList.AddRange(await _sysRoleApiService.GetRoleApiList(roleIds));
|
||||
blackList = blackList.Distinct().ToList();
|
||||
|
||||
blackList.Sort();
|
||||
return blackList;
|
||||
}
|
||||
|
||||
///// <summary>
|
||||
///// 获取用户按钮权限集合
|
||||
///// </summary>
|
||||
///// <returns></returns>
|
||||
//[NonAction]
|
||||
//public async Task<List<string>> GetUserButtonList()
|
||||
//{
|
||||
// var menuIdList = new List<long>();
|
||||
// if (!_userManager.SuperAdmin)
|
||||
// {
|
||||
// var roleIdList = await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
|
||||
// menuIdList = await _sysRoleMenuService.GetRoleMenuIdList(roleIdList);
|
||||
// }
|
||||
// return await GetButtonList(menuIdList);
|
||||
//}
|
||||
|
||||
///// <summary>
|
||||
///// 获取角色按钮权限集合
|
||||
///// </summary>
|
||||
///// <param name="roleIds"></param>
|
||||
///// <returns></returns>
|
||||
//[NonAction]
|
||||
//public async Task<List<string>> GetRoleButtonList(List<long> roleIds)
|
||||
//{
|
||||
// var menuIdList = await _sysRoleMenuService.GetRoleMenuIdList(roleIds);
|
||||
// return await GetButtonList(menuIdList);
|
||||
//}
|
||||
|
||||
/// <summary>
|
||||
/// 根据菜单Id集合获取按钮集合
|
||||
/// </summary>
|
||||
@ -500,16 +416,4 @@ public class SysRoleService : IDynamicApiController, ITransient
|
||||
.Select(u => u.Permission)
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除与该角色相关的用户接口缓存
|
||||
/// </summary>
|
||||
/// <param name="roleId"></param>
|
||||
/// <returns></returns>
|
||||
[NonAction]
|
||||
public async Task ClearUserApiCache(long roleId)
|
||||
{
|
||||
var userIdList = await _sysUserRoleService.GetUserIdList(roleId);
|
||||
foreach (var userId in userIdList) _sysCacheService.Remove(CacheConst.KeyUserSession + userId);
|
||||
}
|
||||
}
|
||||
@ -61,6 +61,9 @@ public class SysRoleTableService : ITransient
|
||||
}
|
||||
|
||||
await _sysRoleTableRep.InsertRangeAsync(sysRoleTableList);
|
||||
|
||||
// 清除关联用户状态
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -167,6 +170,9 @@ public class SysRoleTableService : ITransient
|
||||
public async Task DeleteRolTableByRoleId(long roleId)
|
||||
{
|
||||
await _sysRoleTableRep.DeleteAsync(u => u.RoleId == roleId);
|
||||
|
||||
// 清除关联用户状态
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([roleId]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -184,5 +190,8 @@ public class SysRoleTableService : ITransient
|
||||
u.RoleId = newRoleId;
|
||||
});
|
||||
await _sysRoleTableRep.InsertRangeAsync(roleTableList);
|
||||
|
||||
// 清除关联用户状态
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([newRoleId]);
|
||||
}
|
||||
}
|
||||
@ -347,7 +347,8 @@ public class SysTenantService : IDynamicApiController, ITransient
|
||||
input.Id = adminRole.Id; // 重置租户管理员角色Id
|
||||
await _sysRoleMenuService.GrantRoleMenu(input);
|
||||
|
||||
await _sysRoleService.ClearUserApiCache(input.Id);
|
||||
// 清除关联用户状态
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([input.Id]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -7,9 +7,9 @@
|
||||
namespace Admin.NET.Core;
|
||||
|
||||
/// <summary>
|
||||
/// 用户Session属性扩展接口
|
||||
/// 用户状态属性扩展接口
|
||||
/// </summary>
|
||||
public interface IUserSessionExtProps
|
||||
public interface IUserManagerExtProps
|
||||
{
|
||||
Dictionary<string, object> GetInitExtProps(SysUser user);
|
||||
}
|
||||
@ -39,7 +39,7 @@ public class SysUserRoleService : ITransient
|
||||
await _sysUserRoleRep.InsertRangeAsync(userRoles);
|
||||
|
||||
// 清除缓存
|
||||
_sysCacheService.Remove(CacheConst.KeyUserSession + input.UserId);
|
||||
_sysCacheService.Remove(CacheConst.KeyUserManager + input.UserId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -57,12 +57,6 @@ public class SysUserRoleService : ITransient
|
||||
RoleId = input.Id
|
||||
}).ToList();
|
||||
await _sysUserRoleRep.InsertRangeAsync(userRoles);
|
||||
|
||||
// 清除缓存
|
||||
foreach (var userId in input.UserIdList)
|
||||
{
|
||||
_sysCacheService.Remove(CacheConst.KeyUserSession + userId);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -72,18 +66,10 @@ public class SysUserRoleService : ITransient
|
||||
/// <returns></returns>
|
||||
public async Task DeleteUserRoleByRoleId(long roleId)
|
||||
{
|
||||
var userIdList = await _sysUserRoleRep.AsQueryable()
|
||||
.Where(u => u.RoleId == roleId)
|
||||
.Select(u => u.UserId)
|
||||
.ToListAsync();
|
||||
|
||||
// 清除缓存
|
||||
foreach (var userId in userIdList)
|
||||
{
|
||||
_sysCacheService.Remove(CacheConst.KeyUserSession + userId);
|
||||
}
|
||||
|
||||
await _sysUserRoleRep.DeleteAsync(u => u.RoleId == roleId);
|
||||
|
||||
// 清除关联用户状态
|
||||
LazyHelper.GetService<UserManager>().Value.RemoveByRoleId([roleId]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -95,8 +81,8 @@ public class SysUserRoleService : ITransient
|
||||
{
|
||||
await _sysUserRoleRep.DeleteAsync(u => u.UserId == userId);
|
||||
|
||||
// 清除缓存
|
||||
_sysCacheService.Remove(CacheConst.KeyUserSession + userId);
|
||||
// 清除关联用户状态
|
||||
LazyHelper.GetService<UserManager>().Value.Remove(userId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -61,7 +61,7 @@ public class SysUserService : IDynamicApiController, ITransient
|
||||
public virtual async Task<SqlSugarPagedList<UserOutput>> Page(PageUserInput input)
|
||||
{
|
||||
// 获取用户拥有的机构集合
|
||||
var userOrgIdList = await _sysOrgService.GetUserOrgIdList();
|
||||
var userOrgIdList = _userManager.OrgIds;
|
||||
List<long> orgList = null;
|
||||
List<long> extOrgUserIdList = null;
|
||||
if (input.OrgId > 0) // 指定机构查询时
|
||||
@ -149,12 +149,12 @@ public class SysUserService : IDynamicApiController, ITransient
|
||||
|
||||
// 若账号的角色和组织架构发生变化,则强制下线账号进行权限更新
|
||||
var user = await _sysUserRep.GetByIdAsync(input.Id);
|
||||
var roleIds = await _sysUserRoleService.GetUserRoleIdList(input.Id);
|
||||
if (input.OrgId != user.OrgId || !input.RoleIdList.OrderBy(u => u).SequenceEqual(roleIds.OrderBy(u => u)))
|
||||
{
|
||||
// 强制下线账号和失效Token
|
||||
await OfflineAndExpireToken(user);
|
||||
}
|
||||
// var roleIds = await _sysUserRoleService.GetUserRoleIdList(input.Id);
|
||||
// if (input.OrgId != user.OrgId || !input.RoleIdList.OrderBy(u => u).SequenceEqual(roleIds.OrderBy(u => u)))
|
||||
// {
|
||||
// // 强制下线账号和失效Token
|
||||
// await OfflineAndExpireToken(user);
|
||||
// }
|
||||
|
||||
// 更新用户
|
||||
await _sysUserRep.AsUpdateable(input.Adapt<SysUser>()).IgnoreColumns(true).IgnoreColumns(u => new { u.Password, u.Status, u.TenantId }).ExecuteCommandAsync();
|
||||
@ -168,8 +168,8 @@ public class SysUserService : IDynamicApiController, ITransient
|
||||
// 更新域账号
|
||||
await _sysUserLdapService.AddUserLdap(user.TenantId!.Value, user.Id, user.Account, input.DomainAccount);
|
||||
|
||||
// 清除用户session
|
||||
_userManager.RemoveSession(input.Id);
|
||||
// 清除用户状态
|
||||
_userManager.Remove(input.Id);
|
||||
|
||||
// 发布更新用户事件
|
||||
await _eventPublisher.PublishAsync(UserEventTypeEnum.Update, input);
|
||||
@ -183,7 +183,6 @@ public class SysUserService : IDynamicApiController, ITransient
|
||||
private async Task UpdateRoleAndExtOrg(AddUserInput input)
|
||||
{
|
||||
await GrantRole(new UserRoleInput { UserId = input.Id, RoleIdList = input.RoleIdList });
|
||||
|
||||
await _sysUserExtOrgService.UpdateUserExtOrg(input.Id, input.ExtOrgIdList);
|
||||
}
|
||||
|
||||
@ -229,6 +228,8 @@ public class SysUserService : IDynamicApiController, ITransient
|
||||
|
||||
// 发布删除用户事件
|
||||
await _eventPublisher.PublishAsync(UserEventTypeEnum.Delete, input);
|
||||
|
||||
LazyHelper.GetService<UserManager>().Value.Remove(user.Id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -249,10 +250,9 @@ public class SysUserService : IDynamicApiController, ITransient
|
||||
[DisplayName("更新用户基本信息")]
|
||||
public virtual async Task<int> UpdateBaseInfo(SysUser user)
|
||||
{
|
||||
var count = await _sysUserRep.AsUpdateable(user)
|
||||
.IgnoreColumns(u => new { u.CreateTime, u.Account, u.Password, u.AccountType, u.OrgId, u.PosId }).ExecuteCommandAsync();
|
||||
// 清除用户session
|
||||
_userManager.RemoveSession(user.Id);
|
||||
var count = await _sysUserRep.AsUpdateable(user).IgnoreColumns(u => new { u.CreateTime, u.Account, u.Password, u.AccountType, u.OrgId, u.PosId }).ExecuteCommandAsync();
|
||||
// 清除用户状态
|
||||
_userManager.Remove(user.Id);
|
||||
return count;
|
||||
}
|
||||
|
||||
@ -265,14 +265,12 @@ public class SysUserService : IDynamicApiController, ITransient
|
||||
[DisplayName("设置用户状态")]
|
||||
public virtual async Task<int> SetStatus(BaseStatusInput input)
|
||||
{
|
||||
if (_userManager.UserId == input.Id)
|
||||
throw Oops.Oh(ErrorCodeEnum.D1026);
|
||||
if (_userManager.UserId == input.Id) throw Oops.Oh(ErrorCodeEnum.D1026);
|
||||
|
||||
var user = await _sysUserRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
|
||||
user.ValidateIsSuperAdminAccountType(ErrorCodeEnum.D1015);
|
||||
|
||||
if (!Enum.IsDefined(input.Status))
|
||||
throw Oops.Oh(ErrorCodeEnum.D3005);
|
||||
if (!Enum.IsDefined(input.Status)) throw Oops.Oh(ErrorCodeEnum.D3005);
|
||||
|
||||
if (input.Status != StatusEnum.Enable)
|
||||
{
|
||||
@ -286,6 +284,8 @@ public class SysUserService : IDynamicApiController, ITransient
|
||||
// 发布设置用户状态事件
|
||||
await _eventPublisher.PublishAsync(UserEventTypeEnum.SetStatus, input);
|
||||
|
||||
_userManager.Remove(user.Id);
|
||||
|
||||
return rows;
|
||||
}
|
||||
|
||||
@ -298,16 +298,14 @@ public class SysUserService : IDynamicApiController, ITransient
|
||||
[DisplayName("授权用户角色")]
|
||||
public async Task GrantRole(UserRoleInput input)
|
||||
{
|
||||
var user = await _sysUserRep.GetByIdAsync(input.UserId) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
|
||||
|
||||
// 若角色发生改变则进行更新
|
||||
var roles = await _sysUserRoleService.GetUserRoleIdList(input.UserId);
|
||||
if (!roles.SequenceEqual(input.RoleIdList))
|
||||
{
|
||||
// 更新用户角色
|
||||
await _sysUserRoleService.GrantUserRole(input);
|
||||
// 强制下线账号和失效Token
|
||||
await OfflineAndExpireToken(user);
|
||||
// // 强制下线账号和失效Token
|
||||
// await OfflineAndExpireToken(user);
|
||||
// 发布更新用户角色事件
|
||||
await _eventPublisher.PublishAsync(UserEventTypeEnum.UpdateRole, input);
|
||||
}
|
||||
@ -418,10 +416,10 @@ public class SysUserService : IDynamicApiController, ITransient
|
||||
if (int.TryParse(sysConfig.Value, out int expirationTime) && expirationTime > 0)
|
||||
{
|
||||
var user = await _sysUserRep.GetByIdAsync(_userManager.UserId);
|
||||
if (user.LastChangePasswordTime == null)
|
||||
return false;
|
||||
if ((DateTime.Now - user.LastChangePasswordTime.Value).Days > expirationTime)
|
||||
return false;
|
||||
|
||||
if (user.LastChangePasswordTime == null) return false;
|
||||
|
||||
if ((DateTime.Now - user.LastChangePasswordTime.Value).Days > expirationTime) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -499,7 +497,7 @@ public class SysUserService : IDynamicApiController, ITransient
|
||||
// 强制下线账号
|
||||
await _sysOnlineUserService.ForceOfflineByUserId(user.Id);
|
||||
|
||||
// 清除用户session
|
||||
_userManager.RemoveSession(user.Id);
|
||||
// 清除用户状态
|
||||
_userManager.Remove(user.Id);
|
||||
}
|
||||
}
|
||||
@ -13,26 +13,26 @@ namespace Admin.NET.Core;
|
||||
/// </summary>
|
||||
public class UserManager(
|
||||
SysCacheService sysCacheService,
|
||||
IHttpContextAccessor httpContextAccessor) : UserSessionDao, IScoped
|
||||
IHttpContextAccessor httpContextAccessor) : UserManagerDao, IScoped
|
||||
{
|
||||
/// <summary>
|
||||
/// 用户Session
|
||||
/// 用户状态
|
||||
/// </summary>
|
||||
[System.Text.Json.Serialization.JsonIgnore]
|
||||
[Newtonsoft.Json.JsonIgnore]
|
||||
protected virtual UserSessionDao _session { get; set; }
|
||||
protected virtual UserManagerDao _manager { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 代理对象
|
||||
/// </summary>
|
||||
[System.Text.Json.Serialization.JsonIgnore]
|
||||
[Newtonsoft.Json.JsonIgnore]
|
||||
protected virtual UserSessionDao Session
|
||||
protected virtual UserManagerDao Manager
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_session == null || _session.UserId != UserId) _session = sysCacheService.Get<UserSessionDao>(CacheConst.KeyUserSession + UserId);
|
||||
return _session;
|
||||
if (_manager == null || _manager.UserId != UserId) _manager = sysCacheService.Get<UserManagerDao>(CacheConst.KeyUserManager + UserId);
|
||||
return _manager;
|
||||
}
|
||||
}
|
||||
|
||||
@ -53,167 +53,214 @@ public class UserManager(
|
||||
/// <summary>
|
||||
/// 应用Id
|
||||
/// </summary>
|
||||
public override long? AppId => Session?.AppId;
|
||||
public override long? AppId => Manager?.AppId;
|
||||
|
||||
/// <summary>
|
||||
/// 租户Id
|
||||
/// </summary>
|
||||
public override long? TenantId => Session?.TenantId;
|
||||
public override long? TenantId => Manager?.TenantId;
|
||||
|
||||
/// <summary>
|
||||
/// 用户账号
|
||||
/// </summary>
|
||||
public override string Account => Session?.Account;
|
||||
public override string Account => Manager?.Account;
|
||||
|
||||
/// <summary>
|
||||
/// 真实姓名
|
||||
/// </summary>
|
||||
public override string RealName => Session?.RealName;
|
||||
public override string RealName => Manager?.RealName;
|
||||
|
||||
/// <summary>
|
||||
/// 昵称
|
||||
/// </summary>
|
||||
public override string NickName => Session?.NickName;
|
||||
public override string NickName => Manager?.NickName;
|
||||
|
||||
/// <summary>
|
||||
/// 账号类型
|
||||
/// </summary>
|
||||
public override AccountTypeEnum? AccountType => Session?.AccountType;
|
||||
public override AccountTypeEnum? AccountType => Manager?.AccountType;
|
||||
|
||||
/// <summary>
|
||||
/// 组织机构Id
|
||||
/// </summary>
|
||||
public override long OrgId => Session?.OrgId ?? 0;
|
||||
public override long OrgId => Manager?.OrgId ?? 0;
|
||||
|
||||
/// <summary>
|
||||
/// 组织机构名称
|
||||
/// </summary>
|
||||
public override string OrgName => Session?.OrgName;
|
||||
public override string OrgName => Manager?.OrgName;
|
||||
|
||||
/// <summary>
|
||||
/// 组织机构Id
|
||||
/// </summary>
|
||||
public override string OrgType => Session?.OrgType;
|
||||
public override string OrgType => Manager?.OrgType;
|
||||
|
||||
/// <summary>
|
||||
/// 职位Id
|
||||
/// </summary>
|
||||
public override long? PosId => Session?.PosId;
|
||||
public override long? PosId => Manager?.PosId;
|
||||
|
||||
/// <summary>
|
||||
/// 职位名称
|
||||
/// </summary>
|
||||
public override string PosName => Session?.PosName;
|
||||
public override string PosName => Manager?.PosName;
|
||||
|
||||
/// <summary>
|
||||
/// 职位编码
|
||||
/// </summary>
|
||||
public override string PosCode => Session?.PosCode;
|
||||
public override string PosCode => Manager?.PosCode;
|
||||
|
||||
/// <summary>
|
||||
/// 组织机构级别
|
||||
/// </summary>
|
||||
public override int? OrgLevel => Session?.OrgLevel;
|
||||
public override int? OrgLevel => Manager?.OrgLevel;
|
||||
|
||||
/// <summary>
|
||||
/// 登录模式
|
||||
/// </summary>
|
||||
public override LoginModeEnum? LoginMode => Session?.LoginMode;
|
||||
public override LoginModeEnum? LoginMode => Manager?.LoginMode;
|
||||
|
||||
/// <summary>
|
||||
/// 微信OpenId
|
||||
/// </summary>
|
||||
public override string OpenId => Session?.OpenId;
|
||||
public override string OpenId => Manager?.OpenId;
|
||||
|
||||
/// <summary>
|
||||
/// 数据范围权限列表
|
||||
/// </summary>
|
||||
public override List<DataScopeEnum> DataScopeList => Session?.DataScopeList;
|
||||
public override List<DataScopeEnum> DataScopeList => Manager?.DataScopeList;
|
||||
|
||||
/// <summary>
|
||||
/// 角色Id集
|
||||
/// </summary>
|
||||
public override List<long> RoleIds => Session?.RoleIds;
|
||||
public override List<long> RoleIds => Manager?.RoleIds;
|
||||
|
||||
/// <summary>
|
||||
/// 机构Id集
|
||||
/// </summary>
|
||||
public override List<long> OrgIds => Session?.OrgIds;
|
||||
public override List<long> OrgIds => Manager?.OrgIds;
|
||||
|
||||
/// <summary>
|
||||
/// 职位Id集
|
||||
/// </summary>
|
||||
public override List<long> PosIds => Session?.PosIds;
|
||||
public override List<long> PosIds => Manager?.PosIds;
|
||||
|
||||
/// <summary>
|
||||
/// 权限集
|
||||
/// </summary>
|
||||
public override List<string> Permissions => Session?.Permissions;
|
||||
public override List<string> Permissions => Manager?.Permissions;
|
||||
|
||||
/// <summary>
|
||||
/// App权限集
|
||||
/// </summary>
|
||||
public override List<string> AppPermissions => Session?.AppPermissions;
|
||||
public override List<string> AppPermissions => Manager?.AppPermissions;
|
||||
|
||||
/// <summary>
|
||||
/// 无权权限集
|
||||
/// </summary>
|
||||
public override List<string> UnauthorizedPermissions => Session?.UnauthorizedPermissions;
|
||||
public override List<string> UnauthorizedPermissions => Manager?.UnauthorizedPermissions;
|
||||
|
||||
/// <summary>
|
||||
/// 扩展属性
|
||||
/// </summary>
|
||||
public override Dictionary<string, dynamic> ExtProps => Session?.ExtProps;
|
||||
public override Dictionary<string, dynamic> ExtProps => Manager?.ExtProps;
|
||||
|
||||
/// <summary>
|
||||
/// 用户Session是否存在
|
||||
/// 用户状态是否存在
|
||||
/// </summary>
|
||||
public bool ExistSession(long userId)
|
||||
public bool Exist(long userId)
|
||||
{
|
||||
return sysCacheService.ExistKey(CacheConst.KeyUserSession + userId);
|
||||
return sysCacheService.ExistKey(CacheConst.KeyUserManager + userId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置用户Session
|
||||
/// 设置用户状态
|
||||
/// </summary>
|
||||
public void SetSession(UserSessionDao userSession)
|
||||
public void Set(UserManagerDao userManager)
|
||||
{
|
||||
sysCacheService.Set(CacheConst.KeyUserSession + userSession.UserId, userSession);
|
||||
sysCacheService.Set(CacheConst.KeyUserManager + userManager.UserId, userManager);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清除指定用户Session
|
||||
/// 清除指定用户状态
|
||||
/// </summary>
|
||||
public void RemoveSession(long userId)
|
||||
public void Remove(long userId)
|
||||
{
|
||||
sysCacheService.Remove(CacheConst.KeyUserSession + userId);
|
||||
sysCacheService.Remove(CacheConst.KeyUserManager + userId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定用户Session
|
||||
/// 清除所有用户状态
|
||||
/// </summary>
|
||||
public UserSessionDao GetSession(dynamic userId)
|
||||
public void RemoveAll()
|
||||
{
|
||||
return sysCacheService.Get<UserSessionDao>(CacheConst.KeyUserSession + userId);
|
||||
sysCacheService.RemoveByPrefixKey(CacheConst.KeyUserManager);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定用户Session,如果不存在则刷新
|
||||
/// 根据角色Id集删除用户状态
|
||||
/// </summary>
|
||||
public UserSessionDao GetSessionOrRefresh(dynamic userId = null)
|
||||
public void RemoveByRoleId(List<long> roleIds)
|
||||
{
|
||||
if (roleIds == null || roleIds.Count == 0) return;
|
||||
var list = GetUserManagerList();
|
||||
foreach (var id in roleIds) list?.Where(x => x.RoleIds.Contains(id)).ToList()?.ForEach(x => sysCacheService.Remove(CacheConst.KeyUserManager + x.UserId));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据机构Id集删除用户状态
|
||||
/// </summary>
|
||||
public void RemoveByOrgId(List<long> orgIds)
|
||||
{
|
||||
if (orgIds == null || orgIds.Count == 0) return;
|
||||
var list = GetUserManagerList();
|
||||
foreach (var id in orgIds) list?.Where(x => x.OrgIds.Contains(id)).ToList()?.ForEach(x => sysCacheService.Remove(CacheConst.KeyUserManager + x.UserId));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据职位Id集删除用户状态
|
||||
/// </summary>
|
||||
public void RemoveByPosId(List<long> posIds)
|
||||
{
|
||||
if (posIds == null || posIds.Count == 0) return;
|
||||
var list = GetUserManagerList();
|
||||
foreach (var id in posIds) list?.Where(x => x.PosIds.Contains(id)).ToList()?.ForEach(x => sysCacheService.Remove(CacheConst.KeyUserManager + x.UserId));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定用户状态
|
||||
/// </summary>
|
||||
public UserManagerDao Get(dynamic userId)
|
||||
{
|
||||
return sysCacheService.Get<UserManagerDao>(CacheConst.KeyUserManager + userId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取用户状态列表
|
||||
/// </summary>
|
||||
public List<UserManagerDao> GetUserManagerList()
|
||||
{
|
||||
var keys = sysCacheService.GetKeysByPrefixKey(CacheConst.KeyUserManager);
|
||||
return keys?.Select(x => sysCacheService.Get<UserManagerDao>(x)).ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定用户状态,如果不存在则刷新
|
||||
/// </summary>
|
||||
public UserManagerDao GetOrRefresh(dynamic userId = null)
|
||||
{
|
||||
userId ??= UserId;
|
||||
var session = sysCacheService.Get<UserSessionDao>(CacheConst.KeyUserSession + userId);
|
||||
if (session == null)
|
||||
var userManager = sysCacheService.Get<UserManagerDao>(CacheConst.KeyUserManager + userId);
|
||||
if (userManager == null)
|
||||
{
|
||||
if ((Nullable.GetUnderlyingType(userId.GetType()) ?? userId.GetType()) != typeof(long))
|
||||
{
|
||||
if (long.TryParse(userId.ToString(), out long tempId)) userId = tempId;
|
||||
else return null;
|
||||
}
|
||||
LazyHelper.GetService<SysAuthService>().Value.RefreshSession(userId).GetAwaiter().GetResult();
|
||||
LazyHelper.GetService<SysAuthService>().Value.RefreshUserManager(userId).GetAwaiter().GetResult();
|
||||
}
|
||||
return sysCacheService.Get<UserSessionDao>(CacheConst.KeyUserSession + userId);
|
||||
return sysCacheService.Get<UserManagerDao>(CacheConst.KeyUserManager + userId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -9,7 +9,7 @@ namespace Admin.NET.Core;
|
||||
/// <summary>
|
||||
/// 用户会话信息
|
||||
/// </summary>
|
||||
public class UserSessionDao
|
||||
public class UserManagerDao
|
||||
{
|
||||
/// <summary>
|
||||
/// 用户Id
|
||||
@ -29,8 +29,8 @@ public static class SqlSugarFilter
|
||||
// 用户权限缓存(接口集合)
|
||||
sysCacheService.Remove($"{CacheConst.KeyUserApi}{userId}");
|
||||
|
||||
// 清除用户session
|
||||
sysCacheService.Remove($"{CacheConst.KeyUserSession}{userId}");
|
||||
// 清除用户状态
|
||||
sysCacheService.Remove($"{CacheConst.KeyUserManager}{userId}");
|
||||
|
||||
// 删除用户机构(数据范围)缓存——过滤器
|
||||
_cache.Remove($"db:{dbConfigId}:orgList:{userId}");
|
||||
@ -58,9 +58,9 @@ public static class SqlSugarFilter
|
||||
var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value;
|
||||
if (string.IsNullOrWhiteSpace(userId)) return;
|
||||
|
||||
// 获取用户session
|
||||
var session = LazyHelper.GetService<UserManager>().Value.GetSessionOrRefresh(userId);
|
||||
if (session == null) return;
|
||||
// 获取用户状态
|
||||
var userManager = LazyHelper.GetService<UserManager>().Value.GetOrRefresh(userId);
|
||||
if (userManager == null) return;
|
||||
|
||||
// 配置用户机构集合缓存
|
||||
var cacheKey = $"db:{db.CurrentConnectionConfig.ConfigId}:orgList:{userId}";
|
||||
@ -71,7 +71,7 @@ public static class SqlSugarFilter
|
||||
if (maxDataScope == (int)DataScopeEnum.All) return;
|
||||
|
||||
// 获取用户所属机构,保证同一作用域
|
||||
var orgIds = session.OrgIds;
|
||||
var orgIds = userManager.OrgIds;
|
||||
if (orgIds == null || orgIds.Count == 0) return;
|
||||
|
||||
// 获取业务实体数据表
|
||||
@ -112,12 +112,12 @@ public static class SqlSugarFilter
|
||||
var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value;
|
||||
if (string.IsNullOrWhiteSpace(userId)) return maxDataScope;
|
||||
|
||||
// 获取用户session
|
||||
var session = LazyHelper.GetService<UserManager>().Value.GetSessionOrRefresh(userId);
|
||||
if (session == null) return (int)DataScopeEnum.Self;
|
||||
// 获取用户状态
|
||||
var userManager = LazyHelper.GetService<UserManager>().Value.GetOrRefresh(userId);
|
||||
if (userManager == null) return (int)DataScopeEnum.Self;
|
||||
|
||||
// 获取用户最大数据范围--- 全部数据 -> 自定义
|
||||
maxDataScope = (int)session.MaxDataScope;
|
||||
maxDataScope = (int)userManager.MaxDataScope;
|
||||
if (maxDataScope != (int)DataScopeEnum.Self) return maxDataScope;
|
||||
|
||||
// 配置用户数据范围缓存
|
||||
|
||||
@ -68,11 +68,11 @@ namespace Admin.NET.Web.Core
|
||||
return;
|
||||
}
|
||||
|
||||
// 刷新 Session
|
||||
if (sysCacheService.NotExistKey($"{CacheConst.KeyUserSession}{userId}"))
|
||||
// 刷新 用户状态
|
||||
if (sysCacheService.NotExistKey($"{CacheConst.KeyUserManager}{userId}"))
|
||||
{
|
||||
var sysAuthService = serviceScope.ServiceProvider.GetRequiredService<SysAuthService>();
|
||||
await sysAuthService.RefreshSession(long.Parse(userId!));
|
||||
await sysAuthService.RefreshUserManager(long.Parse(userId!));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user