using System.Collections.Concurrent; using HoneyBox.Admin.Data; using HoneyBox.Admin.Models.Permission; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace HoneyBox.Admin.Services; /// /// 权限服务实现 /// public class PermissionService : IPermissionService { private readonly AdminDbContext _dbContext; private readonly ILogger _logger; // 简单的内存缓存(生产环境建议使用 Redis) private static readonly ConcurrentDictionary Permissions, DateTime ExpireAt)> _permissionCache = new(); private const int CacheMinutes = 30; public PermissionService(AdminDbContext dbContext, ILogger logger) { _dbContext = dbContext; _logger = logger; } /// public async Task> GetUserPermissionsAsync(long adminUserId) { // 尝试从缓存获取 if (_permissionCache.TryGetValue(adminUserId, out var cached) && cached.ExpireAt > DateTime.Now) { return cached.Permissions; } // 从数据库获取 var permissions = await LoadUserPermissionsAsync(adminUserId); // 存入缓存 _permissionCache[adminUserId] = (permissions, DateTime.Now.AddMinutes(CacheMinutes)); return permissions; } /// public async Task HasPermissionAsync(long adminUserId, string permissionCode) { var permissions = await GetUserPermissionsAsync(adminUserId); // 超级管理员拥有所有权限 if (permissions.Contains("*")) { return true; } return permissions.Contains(permissionCode); } /// public void InvalidateCache(long adminUserId) { _permissionCache.TryRemove(adminUserId, out _); _logger.LogDebug("用户 {UserId} 权限缓存已失效", adminUserId); } /// public async Task> GetAllPermissionsAsync() { return await _dbContext.Permissions .OrderBy(p => p.Module) .ThenBy(p => p.Code) .Select(p => new PermissionDto { Id = p.Id, Name = p.Name, Code = p.Code, Module = p.Module, Description = p.Description, CreatedAt = p.CreatedAt }) .ToListAsync(); } /// public async Task>> GetPermissionsByModuleAsync() { var permissions = await GetAllPermissionsAsync(); return permissions .GroupBy(p => p.Module ?? "其他") .ToDictionary(g => g.Key, g => g.ToList()); } /// /// 从数据库加载用户权限 /// private async Task> LoadUserPermissionsAsync(long adminUserId) { // 获取用户的所有角色 var userRoles = await _dbContext.AdminUserRoles .Where(ur => ur.AdminUserId == adminUserId) .Include(ur => ur.Role) .Where(ur => ur.Role.Status == 1) .ToListAsync(); // 检查是否是超级管理员 if (userRoles.Any(ur => ur.Role.Code == "super_admin")) { return new List { "*" }; // 超级管理员拥有所有权限 } var roleIds = userRoles.Select(ur => ur.RoleId).ToList(); // 获取角色关联的权限 var permissions = await _dbContext.RolePermissions .Where(rp => roleIds.Contains(rp.RoleId)) .Include(rp => rp.Permission) .Select(rp => rp.Permission.Code) .Distinct() .ToListAsync(); return permissions; } }