Browse Source

RolesID 更新一下 获取当前用户权限问题

refactor/permission-config
root 3 months ago
parent
commit
74bc851ada
  1. 11
      src/X1.Application/Features/Auth/Commands/RefreshToken/RefreshTokenCommandHandler.cs
  2. 24
      src/X1.Application/Features/Users/Queries/GetCurrentUser/GetCurrentUserQueryHandler.cs
  3. 32
      src/X1.Application/Features/Users/Queries/GetUserById/GetUserByIdQueryHandler.cs
  4. 4
      src/X1.Domain/Repositories/Identity/IUserRoleRepository.cs
  5. 9
      src/X1.Infrastructure/Repositories/Identity/UserRoleRepository.cs
  6. 63
      src/modify_20250121_getuserroles_roleid.md

11
src/X1.Application/Features/Auth/Commands/RefreshToken/RefreshTokenCommandHandler.cs

@ -97,14 +97,15 @@ public sealed class RefreshTokenCommandHandler : IRequestHandler<RefreshTokenCom
return OperationResult<AuthenticateUserResponse>.CreateFailure("无效的刷新令牌");
}
// 获取用户角色
var roles = await _userRoleRepository.GetUserRolesAsync(userId, cancellationToken);
// 获取用户角色信息
var userRoles = await _userRoleRepository.GetUserRolesAsync(userId, cancellationToken);
var roleIds = userRoles.Select(ur => ur.RoleId).ToList();
// 获取所有角色的权限
var permissionCodes = new HashSet<string>();
if (roles.Any())
if (roleIds.Any())
{
var allRolePermissions = await _rolePermissionRepository.GetRolePermissionsByRolesAsync(roles, cancellationToken);
var allRolePermissions = await _rolePermissionRepository.GetRolePermissionsByRolesAsync(roleIds, cancellationToken);
foreach (var rolePermission in allRolePermissions)
{
if (rolePermission.Permission != null)
@ -133,7 +134,7 @@ public sealed class RefreshTokenCommandHandler : IRequestHandler<RefreshTokenCom
claims.FirstOrDefault(c => c.Type == "RealName")?.Value,
claims.FirstOrDefault(c => c.Type == ClaimTypes.Email)?.Value ?? string.Empty,
claims.FirstOrDefault(c => c.Type == ClaimTypes.MobilePhone)?.Value,
roles.ToList().AsReadOnly(),
roleIds.AsReadOnly(),
permissionCodes.ToList().AsReadOnly());
_logger.LogInformation("刷新令牌成功");

24
src/X1.Application/Features/Users/Queries/GetCurrentUser/GetCurrentUserQueryHandler.cs

@ -74,28 +74,18 @@ public sealed class GetCurrentUserQueryHandler : IRequestHandler<GetCurrentUserQ
return OperationResult<UserDto>.CreateFailure("用户不存在");
}
// 获取用户的角色(使用自定义仓储)
var userRoleIds = await _userRoleRepository.GetUserRolesAsync(user.Id, cancellationToken);
// 获取用户的角色信息(使用自定义仓储)
var userRoles = await _userRoleRepository.GetUserRolesAsync(user.Id, cancellationToken);
// 获取角色ID和名称
var roleIds = new List<string>();
var roleNames = new List<string>();
foreach (var roleId in userRoleIds)
{
var role = await _roleManager.FindByIdAsync(roleId);
if (role != null && !string.IsNullOrEmpty(role.Name))
{
roleNames.Add(role.Name);
roleIds.Add(role.Id);
}
}
// 提取角色ID和名称
var roleIds = userRoles.Select(ur => ur.RoleId).ToList();
var roleNames = userRoles.Select(ur => ur.RoleName).ToList();
// 获取用户的所有权限
var permissions = new List<string>();
if (userRoleIds.Any())
if (roleIds.Any())
{
var allRolePermissions = await _rolePermissionRepository.GetRolePermissionsByRolesAsync(userRoleIds, cancellationToken);
var allRolePermissions = await _rolePermissionRepository.GetRolePermissionsByRolesAsync(roleIds, cancellationToken);
foreach (var rolePermission in allRolePermissions)
{
if (rolePermission.Permission != null && !permissions.Contains(rolePermission.Permission.Code))

32
src/X1.Application/Features/Users/Queries/GetUserById/GetUserByIdQueryHandler.cs

@ -68,28 +68,18 @@ public sealed class GetUserByIdQueryHandler : IRequestHandler<GetUserByIdQuery,
return OperationResult<GetUserByIdResponse>.CreateFailure("用户不存在");
}
// 获取用户的角色(使用自定义仓储)
var userRoleIds = await _userRoleRepository.GetUserRolesAsync(user.Id, cancellationToken);
// 获取用户的角色信息(使用自定义仓储)
var userRoles = await _userRoleRepository.GetUserRolesAsync(user.Id, cancellationToken);
// 获取角色ID和名称
var roleIds = new List<string>();
var roleNames = new List<string>();
foreach (var roleId in userRoleIds)
{
var role = await _roleManager.FindByIdAsync(roleId);
if (role != null)
{
roleNames.Add(role.Name);
roleIds.Add(role.Id);
}
}
// 提取角色ID和名称
var roleIds = userRoles.Select(ur => ur.RoleId).ToList();
var roleNames = userRoles.Select(ur => ur.RoleName).ToList();
// 获取用户的所有权限
var permissions = new List<string>();
if (userRoleIds.Any())
if (roleIds.Any())
{
var allRolePermissions = await _rolePermissionRepository.GetRolePermissionsByRolesAsync(userRoleIds, cancellationToken);
var allRolePermissions = await _rolePermissionRepository.GetRolePermissionsByRolesAsync(roleIds, cancellationToken);
foreach (var rolePermission in allRolePermissions)
{
if (rolePermission.Permission != null && !permissions.Contains(rolePermission.Permission.Code))
@ -101,10 +91,10 @@ public sealed class GetUserByIdQueryHandler : IRequestHandler<GetUserByIdQuery,
var dto = new UserDto(
user.Id,
user.UserName,
user.RealName,
user.Email,
user.PhoneNumber,
user.UserName ?? string.Empty,
user.RealName ?? string.Empty,
user.Email ?? string.Empty,
user.PhoneNumber ?? string.Empty,
user.CreatedTime,
user.IsActive,
roleNames,

4
src/X1.Domain/Repositories/Identity/IUserRoleRepository.cs

@ -19,9 +19,9 @@ public interface IUserRoleRepository : IBaseRepository<UserRole>
Task AddUserRolesAsync(IEnumerable<UserRole> userRoles, CancellationToken cancellationToken = default);
/// <summary>
/// 获取用户的所有角色
/// 获取用户的所有角色信息(包含ID和名称)
/// </summary>
Task<IList<string>> GetUserRolesAsync(string userId, CancellationToken cancellationToken = default);
Task<IList<UserRoleInfo>> GetUserRolesAsync(string userId, CancellationToken cancellationToken = default);
/// <summary>
/// 获取用户的所有角色ID

9
src/X1.Infrastructure/Repositories/Identity/UserRoleRepository.cs

@ -42,16 +42,19 @@ public class UserRoleRepository : BaseRepository<UserRole>, IUserRoleRepository
}
/// <summary>
/// 获取用户的所有角色
/// 获取用户的所有角色信息(包含ID和名称)
/// </summary>
public async Task<IList<string>> GetUserRolesAsync(string userId, CancellationToken cancellationToken = default)
public async Task<IList<UserRoleInfo>> GetUserRolesAsync(string userId, CancellationToken cancellationToken = default)
{
var userRoles = await QueryRepository.FindAsync(
ur => ur.UserId == userId,
include: q => q.Include(ur => ur.Role),
cancellationToken: cancellationToken);
return userRoles.Where(ur => ur.Role != null && !string.IsNullOrEmpty(ur.Role.Name)).Select(ur => ur.Role!.Name!).ToList();
return userRoles
.Where(ur => ur.Role != null && !string.IsNullOrEmpty(ur.Role.Name))
.Select(ur => UserRoleInfo.Create(ur.RoleId, ur.Role!.Name!))
.ToList();
}
/// <summary>

63
src/modify_20250121_getuserroles_roleid.md

@ -0,0 +1,63 @@
# 2025-01-21 修改 GetUserRolesAsync 方法,添加获取角色ID功能
## 概述
修改 `GetUserRolesAsync` 方法,使其返回包含角色ID和名称的完整信息,而不是仅返回角色名称列表。
## 主要变更
### 1. 修改接口定义
- **文件**: `X1.Domain/Repositories/Identity/IUserRoleRepository.cs`
- **变更**: 将 `GetUserRolesAsync` 方法的返回类型从 `Task<IList<string>>` 修改为 `Task<IList<UserRoleInfo>>`
- **说明**: 现在返回包含角色ID和名称的完整信息对象
### 2. 修改实现类
- **文件**: `X1.Infrastructure/Repositories/Identity/UserRoleRepository.cs`
- **变更**: 更新 `GetUserRolesAsync` 方法实现,返回 `UserRoleInfo` 对象列表
- **优化**: 使用 `UserRoleInfo.Create()` 方法创建对象,提高代码可读性
### 3. 更新调用代码
- **文件**: `X1.Application/Features/Users/Queries/GetUserById/GetUserByIdQueryHandler.cs`
- **变更**: 更新角色信息获取逻辑,从 `UserRoleInfo` 对象中提取角色ID和名称
- **优化**: 简化代码逻辑,减少数据库查询次数
- **文件**: `X1.Application/Features/Users/Queries/GetCurrentUser/GetCurrentUserQueryHandler.cs`
- **变更**: 同样更新角色信息获取逻辑
- **优化**: 保持与 GetUserById 处理器的一致性
- **文件**: `X1.Application/Features/Auth/Commands/RefreshToken/RefreshTokenCommandHandler.cs`
- **变更**: 更新刷新令牌时的角色信息获取逻辑
- **优化**: 确保令牌刷新时能正确获取角色ID
### 4. 修复编译警告
- **问题**: 修复可能的null引用警告
- **解决**: 在创建 `UserDto` 对象时添加null检查,使用空字符串作为默认值
## 技术优势
### 1. 数据完整性
- **之前**: 只返回角色名称,需要额外查询获取角色ID
- **现在**: 一次查询同时获取角色ID和名称,提高数据完整性
### 2. 性能优化
- **减少查询**: 避免在调用方进行额外的角色查询
- **批量处理**: 一次性获取所有需要的角色信息
### 3. 代码简化
- **调用方**: 简化了调用方的代码逻辑
- **维护性**: 提高了代码的可维护性和一致性
### 4. 向后兼容
- **现有方法**: 保留了 `GetUserRoleIdsAsync``GetUserRoleInfoAsync` 方法
- **渐进升级**: 可以逐步迁移到新的方法签名
## 影响范围
- **仓储层**: 接口和实现类的修改
- **应用层**: 三个查询/命令处理器的更新
- **数据流**: 角色信息获取流程的优化
## 修改的文件列表
1. `X1.Domain/Repositories/Identity/IUserRoleRepository.cs`
2. `X1.Infrastructure/Repositories/Identity/UserRoleRepository.cs`
3. `X1.Application/Features/Users/Queries/GetUserById/GetUserByIdQueryHandler.cs`
4. `X1.Application/Features/Users/Queries/GetCurrentUser/GetCurrentUserQueryHandler.cs`
5. `X1.Application/Features/Auth/Commands/RefreshToken/RefreshTokenCommandHandler.cs`
Loading…
Cancel
Save