// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 // // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 // // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! namespace Admin.NET.Core.Service; /// /// 系统用户角色服务 /// public class SysUserRoleService : ITransient { private readonly UserManager _userManager; private readonly SysCacheService _sysCacheService; private readonly SqlSugarRepository _sysUserRoleRep; public SysUserRoleService(UserManager userManager, SysCacheService sysCacheService, SqlSugarRepository sysUserRoleRep) { _userManager = userManager; _sysCacheService = sysCacheService; _sysUserRoleRep = sysUserRoleRep; } /// /// 授权用户角色 /// /// /// public async Task GrantUserRole(UserRoleInput input) { var targetTenantId = await _sysUserRoleRep.Context.Queryable() .ClearFilter() .Where(u => u.Id == input.UserId) .Select(u => u.TenantId) .FirstAsync(); if (targetTenantId is null or <= 0) throw Oops.Oh(ErrorCodeEnum.D1016); // 有 JWT 时只允许操作当前租户;匿名注册链则以刚创建用户的租户为可信边界。 if (_userManager.TenantId > 0 && targetTenantId != _userManager.TenantId && !_userManager.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D1016); var requestedRoleIds = (input.RoleIdList ?? new List()).Distinct().ToList(); if (requestedRoleIds.Count > 0) { var allowedRoleIds = await _sysUserRoleRep.Context.Queryable() .ClearFilter() .Where(u => u.TenantId == targetTenantId && requestedRoleIds.Contains(u.Id)) .Select(u => u.Id) .ToListAsync(); if (allowedRoleIds.Count != requestedRoleIds.Count) throw Oops.Oh(ErrorCodeEnum.D1016); } await _sysUserRoleRep.DeleteAsync(u => u.UserId == input.UserId); if (requestedRoleIds.Count < 1) { DeleteUserButtonCache(input.UserId); return; } var roles = requestedRoleIds.Select(u => new SysUserRole { UserId = input.UserId, RoleId = u }).ToList(); await _sysUserRoleRep.InsertRangeAsync(roles); DeleteUserButtonCache(input.UserId); } /// /// 根据角色Id删除用户角色 /// /// /// public async Task DeleteUserRoleByRoleId(long roleId) { await _sysUserRoleRep.AsQueryable() .Where(u => u.RoleId == roleId) .Select(u => u.UserId) .ForEachAsync(userId => { DeleteUserButtonCache(userId); }); await _sysUserRoleRep.DeleteAsync(u => u.RoleId == roleId); } /// /// 根据用户Id删除用户角色 /// /// /// public async Task DeleteUserRoleByUserId(long userId) { await _sysUserRoleRep.DeleteAsync(u => u.UserId == userId); DeleteUserButtonCache(userId); } /// /// 根据用户Id获取角色集合 /// /// /// public async Task> GetUserRoleList(long userId) { var tenantId = _userManager.TenantId; if (tenantId <= 0) return new(); return await _sysUserRoleRep.AsQueryable() .InnerJoin((userRole, role) => userRole.RoleId == role.Id) .Where((userRole, role) => userRole.UserId == userId && role.TenantId == tenantId) .Select((userRole, role) => role) .ToListAsync(); } /// /// 根据用户Id获取角色Id集合 /// /// /// public async Task> GetUserRoleIdList(long userId) { var tenantId = _userManager.TenantId; if (tenantId <= 0) return new(); return await _sysUserRoleRep.AsQueryable() .InnerJoin((userRole, role) => userRole.RoleId == role.Id) .Where((userRole, role) => userRole.UserId == userId && role.TenantId == tenantId) .Select((userRole, role) => userRole.RoleId) .ToListAsync(); } /// /// 根据角色Id获取用户Id集合 /// /// /// public async Task> GetUserIdList(long roleId) { return await _sysUserRoleRep.AsQueryable() .Where(u => u.RoleId == roleId).Select(u => u.UserId).ToListAsync(); } private void DeleteUserButtonCache(long userId) { _sysCacheService.RemoveByPrefixKey($"{CacheConst.KeyUserButton}{userId}:"); // 兼容清理升级前不含租户维度的旧 key。 _sysCacheService.Remove($"{CacheConst.KeyUserButton}{userId}"); } }