SysUserRoleService.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. // Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
  2. //
  3. // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
  4. //
  5. // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
  6. namespace Admin.NET.Core.Service;
  7. /// <summary>
  8. /// 系统用户角色服务
  9. /// </summary>
  10. public class SysUserRoleService : ITransient
  11. {
  12. private readonly UserManager _userManager;
  13. private readonly SysCacheService _sysCacheService;
  14. private readonly SqlSugarRepository<SysUserRole> _sysUserRoleRep;
  15. public SysUserRoleService(UserManager userManager,
  16. SysCacheService sysCacheService,
  17. SqlSugarRepository<SysUserRole> sysUserRoleRep)
  18. {
  19. _userManager = userManager;
  20. _sysCacheService = sysCacheService;
  21. _sysUserRoleRep = sysUserRoleRep;
  22. }
  23. /// <summary>
  24. /// 授权用户角色
  25. /// </summary>
  26. /// <param name="input"></param>
  27. /// <returns></returns>
  28. public async Task GrantUserRole(UserRoleInput input)
  29. {
  30. var targetTenantId = await _sysUserRoleRep.Context.Queryable<SysUser>()
  31. .ClearFilter()
  32. .Where(u => u.Id == input.UserId)
  33. .Select(u => u.TenantId)
  34. .FirstAsync();
  35. if (targetTenantId is null or <= 0)
  36. throw Oops.Oh(ErrorCodeEnum.D1016);
  37. // 有 JWT 时只允许操作当前租户;匿名注册链则以刚创建用户的租户为可信边界。
  38. if (_userManager.TenantId > 0 &&
  39. targetTenantId != _userManager.TenantId &&
  40. !_userManager.SuperAdmin)
  41. throw Oops.Oh(ErrorCodeEnum.D1016);
  42. var requestedRoleIds = (input.RoleIdList ?? new List<long>()).Distinct().ToList();
  43. if (requestedRoleIds.Count > 0)
  44. {
  45. var allowedRoleIds = await _sysUserRoleRep.Context.Queryable<SysRole>()
  46. .ClearFilter()
  47. .Where(u => u.TenantId == targetTenantId && requestedRoleIds.Contains(u.Id))
  48. .Select(u => u.Id)
  49. .ToListAsync();
  50. if (allowedRoleIds.Count != requestedRoleIds.Count)
  51. throw Oops.Oh(ErrorCodeEnum.D1016);
  52. }
  53. await _sysUserRoleRep.DeleteAsync(u => u.UserId == input.UserId);
  54. if (requestedRoleIds.Count < 1)
  55. {
  56. DeleteUserButtonCache(input.UserId);
  57. return;
  58. }
  59. var roles = requestedRoleIds.Select(u => new SysUserRole
  60. {
  61. UserId = input.UserId,
  62. RoleId = u
  63. }).ToList();
  64. await _sysUserRoleRep.InsertRangeAsync(roles);
  65. DeleteUserButtonCache(input.UserId);
  66. }
  67. /// <summary>
  68. /// 根据角色Id删除用户角色
  69. /// </summary>
  70. /// <param name="roleId"></param>
  71. /// <returns></returns>
  72. public async Task DeleteUserRoleByRoleId(long roleId)
  73. {
  74. await _sysUserRoleRep.AsQueryable()
  75. .Where(u => u.RoleId == roleId)
  76. .Select(u => u.UserId)
  77. .ForEachAsync(userId =>
  78. {
  79. DeleteUserButtonCache(userId);
  80. });
  81. await _sysUserRoleRep.DeleteAsync(u => u.RoleId == roleId);
  82. }
  83. /// <summary>
  84. /// 根据用户Id删除用户角色
  85. /// </summary>
  86. /// <param name="userId"></param>
  87. /// <returns></returns>
  88. public async Task DeleteUserRoleByUserId(long userId)
  89. {
  90. await _sysUserRoleRep.DeleteAsync(u => u.UserId == userId);
  91. DeleteUserButtonCache(userId);
  92. }
  93. /// <summary>
  94. /// 根据用户Id获取角色集合
  95. /// </summary>
  96. /// <param name="userId"></param>
  97. /// <returns></returns>
  98. public async Task<List<SysRole>> GetUserRoleList(long userId)
  99. {
  100. var tenantId = _userManager.TenantId;
  101. if (tenantId <= 0) return new();
  102. return await _sysUserRoleRep.AsQueryable()
  103. .InnerJoin<SysRole>((userRole, role) => userRole.RoleId == role.Id)
  104. .Where((userRole, role) => userRole.UserId == userId && role.TenantId == tenantId)
  105. .Select((userRole, role) => role)
  106. .ToListAsync();
  107. }
  108. /// <summary>
  109. /// 根据用户Id获取角色Id集合
  110. /// </summary>
  111. /// <param name="userId"></param>
  112. /// <returns></returns>
  113. public async Task<List<long>> GetUserRoleIdList(long userId)
  114. {
  115. var tenantId = _userManager.TenantId;
  116. if (tenantId <= 0) return new();
  117. return await _sysUserRoleRep.AsQueryable()
  118. .InnerJoin<SysRole>((userRole, role) => userRole.RoleId == role.Id)
  119. .Where((userRole, role) => userRole.UserId == userId && role.TenantId == tenantId)
  120. .Select((userRole, role) => userRole.RoleId)
  121. .ToListAsync();
  122. }
  123. /// <summary>
  124. /// 根据角色Id获取用户Id集合
  125. /// </summary>
  126. /// <param name="roleId"></param>
  127. /// <returns></returns>
  128. public async Task<List<long>> GetUserIdList(long roleId)
  129. {
  130. return await _sysUserRoleRep.AsQueryable()
  131. .Where(u => u.RoleId == roleId).Select(u => u.UserId).ToListAsync();
  132. }
  133. private void DeleteUserButtonCache(long userId)
  134. {
  135. _sysCacheService.RemoveByPrefixKey($"{CacheConst.KeyUserButton}{userId}:");
  136. // 兼容清理升级前不含租户维度的旧 key。
  137. _sysCacheService.Remove($"{CacheConst.KeyUserButton}{userId}");
  138. }
  139. }