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;
}
}