当前位置: 首页 > news >正文

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

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

http://www.cnnetsun.cn/news/137467.html

相关文章:

  • 华为云国际站代理商的AS跨境有什么优势呢?
  • NPP 草原:美国中部平原实验牧场(SGS),1939-1990 年,R1
  • CCD相机同步外触发拍照抓拍识别高速脉冲计数器信号采集模块
  • 【网络安全】2025新手如何上手挖漏洞(非常详细)零基础入门到精通,看这篇就够了!
  • BurpSuite渗透测试通关手册,简单几步带你从环境配置到报告生成
  • Python | OpenCV | 图像处理 | 入门实验 | 对比度增强 | 裁剪
  • Apifox:API 接口自动化测试完全指南
  • 正反向代理:网络安全核心技术
  • 别被忽悠了!一文讲透MES管理系统本地部署与SaaS模式的真正底牌
  • 【毕业设计】基于springboot+微信小程序的羽球快讯爱好者平台小程序(源码+文档+远程调试,全bao定制等)
  • 小程序计算机毕设之基于SpringBoot的宠物领养微信小程序基于springboot+微信小程序的宠物领养系统小程序(完整前后端代码+说明文档+LW,调试定制等)
  • 小程序计算机毕设之基于springboot+微信小程序的大学生餐厅点餐系统小程序基于springboot微信小程序的校园食堂订餐服务系统(完整前后端代码+说明文档+LW,调试定制等)
  • 计算机小程序毕设实战-基于springboot+微信小程序的影院售票系统设计与实现基于SpringBoot的电影购票平台微信小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 计算机小程序毕设实战-基于springboot+微信小程序的羽球快讯爱好者平台小程序羽毛球场预定app_羽毛球预约管家【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 11、文本与盒子属性的CSS技巧解析
  • 23、WinJS控件样式与样式规则定位指南
  • 27、Windows 8 应用开发中的 SVG 样式设计
  • SAP ABAP拆分交货单数量、批次、存储地点 并过账
  • 基于MPC的智能车运动预测和控制算法 Motion predication; Kinemati...
  • Mathcad的野路子】11kW PFC参数计算书实战拆解
  • STM32学习笔记CAN
  • 搭建你的第一个“私有知识库” (RAG)
  • 13、Unix 系统磁盘管理与安全定位脚本实用指南
  • 15、系统管理脚本实用指南
  • 怎么选一款适合大面积清洁的多功能全自动洗地机呢?
  • 使用matlab编写m脚本,编写无迹卡尔曼滤波算法(UKF)估计电池SOC,注释清晰
  • 教培行业新媒体运营困境凸显!这款软件或成转型制胜法宝?
  • Photoshop Neural Filters:把“引擎截图”秒变“电影级美宣”?AI 深度模糊与色彩迁移工作流
  • 基于matlab的多目标优化算法NSGA3,动态输出优化过程,得到最终的多目标优化结果。 数据...
  • 12.18