ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

NewLife.Cube权限系统深度解析:用户-角色-菜单-Action四层RBAC模型是如何工作的

NewLife.Cube权限系统深度解析:用户-角色-菜单-Action四层RBAC模型是如何工作的 NewLife.Cube权限系统深度解析用户-角色-菜单-Action四层RBAC模型是如何工作的【免费下载链接】NewLife.CubeWeb快速开发平台搭建管理后台灵活可扩展内部集成了用户权限管理、模板继承、SSO登录、OAuth服务端、数据导出与分享等多个功能模块在真实项目中经历过单表100亿数据添删改查的考验。项目地址: https://gitcode.com/gh_mirrors/ne/NewLife.CubeNewLife.Cube 权限系统是这款 .NET Web 快速开发平台的核心安全模块它采用经典的RBAC基于角色的访问控制模型通过用户-角色-菜单-Action四层结构把谁能看什么页面、能点哪个按钮、能改哪条数据管理得清清楚楚。本文面向新手用尽量少的代码带你彻底搞懂这套权限模型的工作原理。一、为什么需要四层权限模型一个管理后台最典型的烦恼是给 100 个员工发账号后老板只能看报表、客服只能建工单、财务能删凭证……如果权限写死在代码里每改一次需求都要改代码、重新发布。魔方NewLife.Cube的解法是把权限拆成4 个可独立配置的层级层层递进、粒度由粗到细。层级回答的问题例子用户你是谁张三运营角色你属于哪类人运营、财务、管理员菜单你能进哪些功能模块用户管理、订单管理Action你能执行哪些操作查看、添加、编辑、删除 核心思想用户不直接绑权限而是绑定角色权限挂在角色和菜单的关系上。这样给新人配权限只需 30 秒建角色 → 勾权限 → 分配用户。二、全景图四层之间如何串起来权限的流转链路是一条单向链条关系基数如下┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 用户 │────│ 角色 │────│ 菜单 │────│ Action │ │ (User) │ N:N │ (Role) │ N:N │ (Menu) │ 1:N │(操作权限) │ └──────────┘ └──────────┘ └──────────┘ └──────────┘用一句话概括每一段关系用户 → 角色一个用户可以属于多个角色如客服 内容审核权限自动取并集角色 → 菜单一个角色可以管理多个菜单一个菜单也可被多个角色共享菜单 → Action每个菜单对应一组固定操作查/增/改/删按位存储这套模型天然覆盖了 4 种权限粒度粒度说明示例菜单级侧边栏是否显示这个菜单能否看到用户管理页面级能否打开对应页面能否进入用户列表页操作级页面里能点哪些按钮能否点击删除数据级能操作哪些数据只能看本部门数据 还有一个贴心的新手设计系统首次启动时第一个注册的用户自动成为管理员拥有全部权限无需手动配置。三、权限的基因位运算存储魔方没有用一张张权限关系表而是给每个角色-菜单关系存一个PermissionFlags 标志位源码见NewLife.Cube/Common/EntityAuthorizeAttribute.cs权限位值含义Detail1查看列表、详情Insert2添加Update4修改Delete8删除All15以上全部为什么用1、2、4、8这种值因为它们是 2 的幂任意组合都不会重叠用一个字节就能表达 16 种权限组合存储值组合实际含义1查只读用户3查 增数据录入员7查 增 改业务操作员8删少见只许删除15查 增 改 删该模块全权判断有没有某权限只需一次按位与运算O(1) 完成即使权限点成千上万也不影响性能——这正是平台敢在单表百亿级数据场景下依然稳定的底层原因之一。四、Action 层详解每个接口方法就是一个权限点这是四层中最精细的一层。魔方为控制器方法提供了EntityAuthorize授权特性把接口方法与权限位直接挂钩[EntityAuthorize(PermissionFlags.Delete)] // 删除需要 Delete 权限 public ActionResult Delete(int id) { ... }请求到来时授权过滤器源码NewLife.Cube/Common/EntityAuthorizeAttribute.cs会执行三步定位菜单根据控制器与 URL 自动找到对应的资源菜单校验权限位取出当前用户所有角色在该菜单上的权限位判断是否包含要求的 Action返回结果未登录返回 401登录但无权限返回 403并把拒绝原因写入访问日志两个值得新手记住的细节按钮级控制页面里添加/编辑/删除按钮是否显示同样由权限位决定——没权限的按钮直接不渲染而不是点了报错自定义权限子项当查增改删不够用时如导出报表审核通过可以把高位16、32、64…注册为自定义权限点挂到菜单上与内置权限共用同一套位运算机制五、菜单层启动自动扫描一人一份菜单菜单是权限的载体也是用户看到的导航骨架详细文档见Doc/PERM-菜单系统.md。自动注册开发时无需手工建菜单。给控制器加上[Menu]特性源码NewLife.Cube/Common/MenuAttribute.cs魔方启动时就会自动扫描所有控制器按区域 → 控制器 → 方法生成菜单树并写入数据库[Menu(Order 10, Icon fa-box)] public class ProductController : EntityControllerProduct { }一人一份菜单前端渲染侧边栏时调用的是当前用户可见菜单树接口系统会过滤掉用户无 Detail 权限的节点——菜单本身就是权限的直观体现。多租户双模式菜单特性还支持MenuModesAdmin / Tenant控制菜单只在管理后台可见、还是租户端可见授权过滤器在每次请求中都会校验模式是否匹配保证管理后台与租户门户互不串门。六、数据权限从能不能操作到能操作哪些数据前三层解决功能权限第四层数据级解决能操作哪些数据。这是 RBAC 之外的增量能力场景配置方式多租户隔离按 TenantId 过滤租户间数据完全隔离部门隔离按 DepartmentId 过滤只能看本部门创建者限制按 CreateUserId 过滤只能改自己的单据使用方式是在控制器上标注[DataPermission]特性源码NewLife.Cube/Common/DataPermissionAttribute.cs声明实体中哪些字段代表租户/部门/创建者后续查询会自动附加过滤条件开发者写业务代码时无需关心权限过滤也不会因为忘记过滤而越权。 记忆公式功能权限管门数据权限管门里的货架。七、访问规则请求进来之前的安全闸门RBAC 管的是登录后能做什么而魔方还有一层前置安检——访问规则AccessRule在请求进入权限体系之前就完成拦截实现 IP 黑名单、路径拦截、限流与爬虫封禁设计文档见Doc/PERM-访问规则.md架构脑图如下。维度支持能力匹配条件URL、IP、User-Agent、已登录用户均支持通配符与模糊匹配执行动作放行Pass/ 拦截Block/ 限流Limit高级模式响应码动态检测某 IP 频繁触发 403/404 时自动封禁优先级Priority 越大越先匹配Pass 一旦命中立即放行可做内网白名单规则实体与执行服务分别在NewLife.Cube/Entity/访问规则.cs与NewLife.CubeNC/Services/AccessService.cs管理端可视化配置无需改代码。八、一次请求的完整校验链路把前面所有内容串起来一次访问的权限链路是这样的请求到达 → ① 访问规则匹配IP/URL/UA/限流 → ② 登录态校验未登录 → 401 → ③ 定位资源菜单控制器/URL → 菜单 → ④ 权限位校验角色权限位 要求位 → 不通过 → 403 → ⑤ 多租户模式校验Admin/Tenant 菜单互斥 → ⑥ 数据权限过滤自动附加租户/部门/创建者条件 → 执行 Action返回结果状态码含义典型原因401未认证未登录或会话超时403无权限登录了但角色权限位不含该 Action所有拒绝访问都会带 IP、用户名、资源名写入访问日志方便安全审计与排障。九、新手配置权限的实战建议️ 按场景建角色推荐三种起步模板角色权限组合适用对象只读用户全部菜单 Detail值1老板、审计、外部顾问数据录入员业务菜单 DetailInsert值3运营、客服部门管理员核心菜单 All值15 敏感菜单 Detail部门主管 检查清单优先使用内置权限位查增改删不足再注册自定义高位权限点菜单层级建议不超过 3 级命名名词式用户管理、订单管理敏感操作删除、导出单独配权限并开启数据权限上线前配置访问规则登录接口限流 高频 403 动态封禁定期检查访问日志中的 403 记录及时修正权限分配更多细节可参考官方文档Doc/PERM-权限系统.md权限模型、Doc/PERM-菜单系统.md菜单、Doc/PERM-数据权限.md数据级、Doc/PERM-访问规则.md前置安检。结语NewLife.Cube 的权限系统把 RBAC 的用户-角色-菜单-Action四层模型做到了可自动注册、可位运算校验、可数据级过滤、可前置拦截四个深度开发者写业务时几乎无感管理员配置时只需勾选系统校准时只做一次按位运算。对于要快速搭建管理后台的团队来说这大概就是权限系统开箱即用该有的样子。【免费下载链接】NewLife.CubeWeb快速开发平台搭建管理后台灵活可扩展内部集成了用户权限管理、模板继承、SSO登录、OAuth服务端、数据导出与分享等多个功能模块在真实项目中经历过单表100亿数据添删改查的考验。项目地址: https://gitcode.com/gh_mirrors/ne/NewLife.Cube创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表