news 2026/1/10 18:36:55

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
.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

基础仓储接口设计

定义基础仓储接口,包含数据权限过滤方法:

publicinterfaceIRepository<T>whereT:class{IQueryable<T>GetAll();IQueryable<T>GetByDepartment(intdepartmentId);IQueryable<T>GetByDepartmentWithChildren(intdepartmentId);IQueryable<T>GetByUser(intuserId);}
实现数据权限过滤

在具体仓储实现中,通过EFCore的查询表达式实现不同级别的数据过滤:

publicclassRepository<T>:IRepository<T>whereT:class,IDataPermission{privatereadonlyDbContext_context;privatereadonlyICurrentUser_currentUser;publicRepository(DbContextcontext,ICurrentUsercurrentUser){_context=context;_currentUser=currentUser;}publicIQueryable<T>GetAll(){return_context.Set<T>().AsQueryable();}publicIQueryable<T>GetByDepartment(intdepartmentId){return_context.Set<T>().Where(x=>x.DepartmentId==departmentId);}publicIQueryable<T>GetByDepartmentWithChildren(intdepartmentId){vardepartmentIds=GetChildDepartmentIds(departmentId);return_context.Set<T>().Where(x=>departmentIds.Contains(x.DepartmentId));}publicIQueryable<T>GetByUser(intuserId){return_context.Set<T>().Where(x=>x.CreatedBy==userId);}privateList<int>GetChildDepartmentIds(intparentId){// 递归获取所有子部门ID}}
实体接口设计

定义数据权限相关实体接口,确保实体包含必要字段:

publicinterfaceIDataPermission{intDepartmentId{get;set;}intCreatedBy{get;set;}}
动态权限查询扩展

创建扩展方法,根据用户权限动态选择查询范围:

publicstaticclassRepositoryExtensions{publicstaticIQueryable<T>WithDataPermission<T>(thisIRepository<T>repository,DataPermissionLevellevel)whereT:class,IDataPermission{switch(level){caseDataPermissionLevel.All:returnrepository.GetAll();caseDataPermissionLevel.Department:returnrepository.GetByDepartment(currentUser.DepartmentId);caseDataPermissionLevel.DepartmentWithChildren:returnrepository.GetByDepartmentWithChildren(currentUser.DepartmentId);caseDataPermissionLevel.Owner:returnrepository.GetByUser(currentUser.UserId);default:thrownewArgumentOutOfRangeException();}}}
权限枚举定义

定义数据权限级别枚举:

publicenumDataPermissionLevel{All,Department,DepartmentWithChildren,Owner}
使用示例

在服务层或控制器中使用数据权限过滤:

publicclassEmployeeService{privatereadonlyIRepository<Employee>_repository;privatereadonlyICurrentUser_currentUser;publicEmployeeService(IRepository<Employee>repository,ICurrentUsercurrentUser){_repository=repository;_currentUser=currentUser;}publicList<Employee>GetEmployees(DataPermissionLevellevel){return_repository.WithDataPermission(level).ToList();}}
权限控制中间件

可以创建中间件自动设置当前用户的数据权限级别:

publicclassDataPermissionMiddleware{privatereadonlyRequestDelegate_next;publicDataPermissionMiddleware(RequestDelegatenext){_next=next;}publicasyncTaskInvokeAsync(HttpContextcontext,ICurrentUsercurrentUser){// 根据用户角色设置数据权限级别currentUser.DataPermissionLevel=GetPermissionLevelFromClaims(context.User);await_next(context);}}

这种实现方式通过仓储模式统一了数据权限控制逻辑,使业务代码无需关心具体权限实现细节,只需指定权限级别即可自动过滤数据。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/9 14:22:25

刷题日记day8(图论拓扑关系)

简介 本篇介绍两道有关拓扑排序的问题&#xff0c;难度为洛谷黄题 前置知识 拓扑排序就是一系列有不同优先级的事件的排列&#xff0c;其中优先级相同的事情可以相互交换 关键结论一个图能进行拓扑排序的充要条件是它是一个有向无环图(DAG) 入度和出度的概念 1.入度&#xf…

作者头像 李华
网站建设 2026/1/8 7:23:59

开源赋能+技术深耕:AgentRun Sandbox SDK 重塑智能体开发新范式

在大模型技术飞速迭代的今天&#xff0c;智能体&#xff08;Agent&#xff09;已经从概念走向实际应用&#xff0c;成为连接技术与场景的核心桥梁。无论是数据分析、网页交互还是复杂任务自动化&#xff0c;智能体都在展现出强大的潜力。但对于广大开发者而言&#xff0c;智能体…

作者头像 李华
网站建设 2025/12/18 20:31:55

CentOS9安装Docker

要在 CentOS 9 上安装 Docker&#xff0c;你可以通过添加官方 Docker 仓库的方式来简化安装过程。 步骤 1: 安装必要的软件包 首先&#xff0c;你需要安装一些必要的软件包&#xff0c;以便能够添加新的仓库并管理软件包。 sudo dnf install -y yum-utils device-mapper-persi…

作者头像 李华
网站建设 2025/12/18 20:31:27

告别频繁校准,效率成本双拿捏!这款MEMS寻北仪刷新行业新体验

在巷道掘进、管线测绘、地质勘探等精密工程作业中&#xff0c;MEMS寻北仪的测量稳定性与运维便捷性&#xff0c;直接决定了项目的推进效率与综合成本。传统寻北设备因机械结构局限&#xff0c;不仅需要频繁停机校准&#xff0c;还常因元件磨损、环境干扰引发参数漂移&#xff0…

作者头像 李华
网站建设 2026/1/10 7:56:18

汇编指令在不同架构中的联系与区别

汇编指令在不同架构中的联系与区别 一、核心联系&#xff08;共性&#xff09;基本概念相同 都是对CPU的直接控制都包含数据移动、算术运算、逻辑运算、控制转移等基本操作都涉及寄存器、内存、I/O等硬件资源操作层次定位相同 都处于软件-硬件交界层都是一对一地映射到机器指令…

作者头像 李华