news 2026/9/8 11:24:56

.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/9/7 16:20:34

华为云国际站代理商的AS跨境有什么优势呢?

你这里提到的 AS 大概率是华为云的自动伸缩&#xff08;Auto Scaling&#xff09;服务&#xff0c;华为云国际站代理商提供的该服务用于跨境场景时&#xff0c;能凭借技术适配、成本优化和本地化服务等多方面优势&#xff0c;助力企业解决跨境业务中的资源调度、合规和运维等难…

作者头像 李华
网站建设 2026/9/8 9:43:08

NPP 草原:美国中部平原实验牧场(SGS),1939-1990 年,R1

NPP Grassland: Central Plains Experimental Range (SGS), USA, 1939-1990, R1 简介 该数据集记录了位于科罗拉多州中北部中央平原实验保护区&#xff08;CPER&#xff09;/波尼国家草原的半干旱短草草原的生产力。数据集包含九个数据文件&#xff08;.txt&#xff09;。其中…

作者头像 李华
网站建设 2026/9/7 7:24:14

CCD相机同步外触发拍照抓拍识别高速脉冲计数器信号采集模块

相机触发脉冲计数器是一种基于外部脉冲信号&#xff08;如来自编码器或传感器&#xff09;的触发模式&#xff0c;用于在特定脉冲数量到达时启动相机图像采集。这种模式通过计数器模块累积输入脉冲&#xff0c;并在达到预设阈值时生成触发信号&#xff0c;实现精确的定时或等距…

作者头像 李华
网站建设 2026/9/8 1:22:08

BurpSuite渗透测试通关手册,简单几步带你从环境配置到报告生成

在Web应用安全测试中&#xff0c;Burp Suite被誉为“渗透测试的瑞士军刀”&#xff0c;其强大的扫描功能能高效挖掘SQL注入、XSS、信息泄露等漏洞。本文将结合实战步骤&#xff0c;详细解析如何利用Burp Suite进行安全扫描&#xff0c;助你快速掌握核心技巧&#xff01; 一、扫…

作者头像 李华
网站建设 2026/9/8 10:17:08

Python | OpenCV | 图像处理 | 入门实验 | 对比度增强 | 裁剪

0. 前言 “图像处理”听起来高大上&#xff0c;其实用 20 行 Python 就能跑起来。 今天带大家在 10 分钟 内完成一次真实可跑的实验&#xff1a;把一张机器人照片 robot.jpg 切成左上角&#xff1b;再把亮度 / 对比度拉满&#xff1b;最后保存成新图 robot_enhanced.jpg。读完你…

作者头像 李华