欤夤 发表于 2025-12-18 19:00:06

.Net通过EFCore和仓储模式实现统一数据权限管控并且相关权限配置动态生成

基于EFCore实现统一数据权限管控

在.NET应用中,通过EFCore和仓储模式实现数据权限管控,可以按照以下方式设计:
数据权限层级定义

数据权限通常分为四个层级:所有数据、本部门数据、本部门及下属部门数据、本人数据。通过仓储模式可以统一封装这些查询逻辑。
具体实现可参考NetCoreKevin的Kevin.EntityFrameworkCore.Repository`和kevin.Permission服务模块:实现统一数据权限管控并且相关权限配置动态生成

基于NET构建的现代化AI智能体Saas企业级架构:

项目地址:github:https://github.com/junkai-li/NetCoreKevin
Gitee: https://gitee.com/netkevin-li/NetCoreKevin
基础仓储接口设计

定义基础仓储接口,包含数据权限过滤方法:
public interface IRepository<T> where T : class
{
    IQueryable<T> GetAll();
    IQueryable<T> GetByDepartment(int departmentId);
    IQueryable<T> GetByDepartmentWithChildren(int departmentId);
    IQueryable<T> GetByUser(int userId);
}实现数据权限过滤

在具体仓储实现中,通过EFCore的查询表达式实现不同级别的数据过滤:
public class Repository<T> : IRepository<T> where T : class, IDataPermission
{
    private readonly DbContext _context;
    private readonly ICurrentUser _currentUser;

    public Repository(DbContext context, ICurrentUser currentUser)
    {
      _context = context;
      _currentUser = currentUser;
    }

    public IQueryable<T> GetAll()
    {
      return _context.Set<T>().AsQueryable();
    }

    public IQueryable<T> GetByDepartment(int departmentId)
    {
      return _context.Set<T>().Where(x => x.DepartmentId == departmentId);
    }

    public IQueryable<T> GetByDepartmentWithChildren(int departmentId)
    {
      var departmentIds = GetChildDepartmentIds(departmentId);
      return _context.Set<T>().Where(x => departmentIds.Contains(x.DepartmentId));
    }

    public IQueryable<T> GetByUser(int userId)
    {
      return _context.Set<T>().Where(x => x.CreatedBy == userId);
    }

    private List<int> GetChildDepartmentIds(int parentId)
    {
      // 递归获取所有子部门ID
    }
}实体接口设计

定义数据权限相关实体接口,确保实体包含必要字段:
public interface IDataPermission
{
    int DepartmentId { get; set; }
    int CreatedBy { get; set; }
}动态权限查询扩展

创建扩展方法,根据用户权限动态选择查询范围:
public static class RepositoryExtensions
{
    public static IQueryable<T> WithDataPermission<T>(this IRepository<T> repository, DataPermissionLevel level)
      where T : class, IDataPermission
    {
      switch(level)
      {
            case DataPermissionLevel.All:
                return repository.GetAll();
            case DataPermissionLevel.Department:
                return repository.GetByDepartment(currentUser.DepartmentId);
            case DataPermissionLevel.DepartmentWithChildren:
                return repository.GetByDepartmentWithChildren(currentUser.DepartmentId);
            case DataPermissionLevel.Owner:
                return repository.GetByUser(currentUser.UserId);
            default:
                throw new ArgumentOutOfRangeException();
      }
    }
}权限枚举定义

定义数据权限级别枚举:
public enum DataPermissionLevel
{
    All,
    Department,
    DepartmentWithChildren,
    Owner
}使用示例

在服务层或控制器中使用数据权限过滤:
public class EmployeeService
{
    private readonly IRepository<Employee> _repository;
    private readonly ICurrentUser _currentUser;

    public EmployeeService(IRepository<Employee> repository, ICurrentUser currentUser)
    {
      _repository = repository;
      _currentUser = currentUser;
    }

    public List<Employee> GetEmployees(DataPermissionLevel level)
    {
      return _repository.WithDataPermission(level).ToList();
    }
}权限控制中间件

可以创建中间件自动设置当前用户的数据权限级别:
public class DataPermissionMiddleware
{
    private readonly RequestDelegate _next;

    public DataPermissionMiddleware(RequestDelegate next)
    {
      _next = next;
    }

    public async Task InvokeAsync(HttpContext context, ICurrentUser currentUser)
    {
      // 根据用户角色设置数据权限级别
      currentUser.DataPermissionLevel = GetPermissionLevelFromClaims(context.User);
      
      await _next(context);
    }
}这种实现方式通过仓储模式统一了数据权限控制逻辑,使业务代码无需关心具体权限实现细节,只需指定权限级别即可自动过滤数据。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

县挫伪 发表于 2025-12-20 17:07:44

很好很强大我过来先占个楼 待编辑

悯拄等 发表于 2026-1-2 23:01:22

这个有用。

梁丘艷蕙 发表于 2026-1-13 21:24:55

鼓励转贴优秀软件安全工具和文档!

扔飒 发表于 2026-1-18 17:46:46

分享、互助 让互联网精神温暖你我

仰翡邸 发表于 2026-1-19 09:46:26

前排留名,哈哈哈

颓哀 发表于 2026-1-24 05:26:32

这个好,看起来很实用

颛孙中 发表于 2026-1-26 12:11:38

懂技术并乐意极积无私分享的人越来越少。珍惜

丝甲坞 发表于 2026-1-27 06:59:33

新版吗?好像是停更了吧。

县挫伪 发表于 2026-1-27 07:01:54

感谢,下载保存了

材部 发表于 2026-1-28 03:04:31

yyds。多谢分享

孟茹云 发表于 2026-1-29 06:01:01

前排留名,哈哈哈

峰埋姚 发表于 2026-2-2 04:33:32

这个好,看起来很实用

麓吆 发表于 2026-2-3 05:54:55

很好很强大我过来先占个楼 待编辑

注思 发表于 2026-2-4 10:33:07

感谢分享

酒跚骼 发表于 2026-2-4 15:27:38

谢谢分享,辛苦了

韩素欣 发表于 2026-2-7 07:09:49

谢谢分享,试用一下

沃盼盼 发表于 2026-2-8 07:07:50

感谢分享,下载保存了,貌似很强大

株兆凝 发表于 2026-2-9 14:33:29

用心讨论,共获提升!

赙浦 发表于 2026-2-10 05:58:10

热心回复!
页: [1] 2
查看完整版本: .Net通过EFCore和仓储模式实现统一数据权限管控并且相关权限配置动态生成