news 2026/7/28 8:58:13

.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/7/28 11:38:32

华为云国际站FunctionGraph支持哪些编程语言?

华为云国际站 FunctionGraph 作为无服务器计算服务&#xff0c;支持多类主流编程语言&#xff0c;覆盖编译型、解释型及脚本类&#xff0c;适配不同开发者的技术栈和业务开发需求&#xff0c;具体支持的语言及版本如下&#xff1a;一、核心支持的编程语言及主流版本编程语言支持…

作者头像 李华
网站建设 2026/7/28 13:12:39

GEE训练教程:2024年基于GEMI指数的植被变化全解析

简介 巴基斯坦拉合尔市2024年的植被状况,主要特点: GEMI指数特点: 全球环境监测指数(Global Environmental Monitoring Index, GEMI)是一种基于卫星遥感的植被指数,于1996年由Pinty和Verstraete提出。它是专门为全球尺度的植被监测而设计的,特别强调对大气影响的抵抗能…

作者头像 李华
网站建设 2026/7/28 15:44:03

算法练习5--数组:螺旋矩阵

力扣59#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {int** nums (int**)malloc(n * sizeof(int*));for (int i 0; i < n; i){nums[i] (int*)malloc(n …

作者头像 李华
网站建设 2026/7/27 21:24:44

技术突破:噬菌体文库制备如何为猪腹泻病毒检测注入新动力?

在生猪养殖领域&#xff0c;仔猪腹泻一直是困扰业界的难题&#xff0c;其背后主要的病毒元凶——猪传染性胃肠炎病毒&#xff08;TGEV&#xff09;和猪德尔塔冠状病毒&#xff08;PDCoV&#xff09;&#xff0c;因其变异快、混合感染常见&#xff0c;给精准诊断带来了巨大挑战。…

作者头像 李华
网站建设 2026/7/28 16:27:47

微算法科技(NASDAQ MLGO)使用多线程技术提升区块链共识算法的性能

在区块链技术从概念验证走向大规模商业应用的进程中&#xff0c;共识算法的性能瓶颈始终是制约其发展的核心挑战。传统区块链网络&#xff08;如比特币、以太坊&#xff09;采用的Proof of Work&#xff08;PoW&#xff09;共识机制因算力竞争导致低效与高能耗&#xff0c;而改…

作者头像 李华