news 2026/4/23 2:13:33

【架构实战】权限系统设计:RBAC vs ABAC

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【架构实战】权限系统设计:RBAC vs ABAC

一、权限模型概述

权限系统是应用安全的基础:

权限模型:

  • DAC(自主访问控制)
  • MAC(强制访问控制)
  • RBAC(基于角色的访问控制)
  • ABAC(基于属性的访问控制)

二、RBAC模型

1. RBAC核心概念

用户 → 角色 → 权限 │ │ │ └── 权限(功能操作) │ └── 角色(职责集合)

2. RBAC数据库设计

-- 用户表CREATETABLEsys_user(idBIGINTPRIMARYKEYAUTO_INCREMENT,usernameVARCHAR(50)NOTNULLUNIQUE,passwordVARCHAR(100)NOTNULL,nicknameVARCHAR(50),statusTINYINTDEFAULT1,create_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP);-- 角色表CREATETABLEsys_role(idBIGINTPRIMARYKEYAUTO_INCREMENT,role_codeVARCHAR(50)NOTNULLUNIQUE,role_nameVARCHAR(50)NOTNULL,descriptionVARCHAR(200),statusTINYINTDEFAULT1);-- 权限表CREATETABLEsys_permission(idBIGINTPRIMARYKEYAUTO_INCREMENT,perm_codeVARCHAR(100)NOTNULLUNIQUE,perm_nameVARCHAR(50)NOTNULL,resource_typeVARCHAR(20),-- menu, button, apiresource_pathVARCHAR(200),descriptionVARCHAR(200));-- 用户角色关联CREATETABLEsys_user_role(user_idBIGINT,role_idBIGINT,PRIMARYKEY(user_id,role_id));-- 角色权限关联CREATETABLEsys_role_permission(role_idBIGINT,permission_idBIGINT,PRIMARYKEY(role_id,permission_id));

3. RBAC实现

@ServicepublicclassRbacService{// 获取用户权限publicSet<String>getUserPermissions(LonguserId){List<Permission>permissions=permissionMapper.selectByUserId(userId);returnpermissions.stream().map(Permission::getPermCode).collect(Collectors.toSet());}// 检查权限publicbooleanhasPermission(LonguserId,Stringpermission){Set<String>permissions=getUserPermissions(userId);returnpermissions.contains(permission);}// 权限注解@PreAuthorize("@rbacService.hasPermission(#userId, 'order:create')")publicOrdercreateOrder(LonguserId,OrderRequestrequest){// 创建订单returnorder;}}

三、ABAC模型

1. ABAC核心概念

访问决策 = f(用户属性, 资源属性, 环境属性, 操作属性)

属性类型:

  • 用户属性:部门、职位、资历
  • 资源属性:敏感等级、所有者
  • 环境属性:时间、IP、地点
  • 操作属性:读取、修改、删除

2. ABAC策略配置

{"policyId":"order-access-policy","description":"订单访问控制策略","subject":{"attributes":{"department":"string","position":"string"}},"resource":{"attributes":{"owner":"string","sensitivity":"string"}},"action":{"attributes":{"operation":["read","write","delete"]}},"rules":[{"effect":"permit","condition":{"and":[{"==":[{"var":"resource.owner"},{"var":"subject.userId"}]},{"==":[{"var":"action.operation"},"read"]}]}},{"effect":"permit","condition":{"and":[{"==":[{"var":"subject.position"},"manager"]},{"==":[{"var":"resource.sensitivity"},"normal"]}]}}]}

3. ABAC实现

@ServicepublicclassAbacService{@AutowiredprivatePolicyRepositorypolicyRepository;publicbooleanevaluate(Subjectsubject,Resourceresource,Actionaction){// 加载匹配的策略List<Policy>policies=policyRepository.findMatchingPolicies(subject,resource,action);for(Policypolicy:policies){if(evaluatePolicy(policy,subject,resource,action)){returnpolicy.getEffect()==PolicyEffect.PERMIT;}}// 默认拒绝returnfalse;}privatebooleanevaluatePolicy(Policypolicy,Subjectsubject,Resourceresource,Actionaction){for(Rulerule:policy.getRules()){if(!evaluateRule(rule,subject,resource,action)){returnfalse;}}returntrue;}privatebooleanevaluateRule(Rulerule,Subjectsubject,Resourceresource,Actionaction){Conditioncondition=rule.getCondition();returnevaluateCondition(condition,subject,resource,action);}}

四、RBAC vs ABAC对比

维度RBACABAC
复杂度
灵活性
维护成本
粒度角色级属性级
适用场景固定角色复杂权限

五、权限系统设计

1. 菜单权限

@ServicepublicclassMenuPermissionService{publicList<MenuVO>getUserMenus(LonguserId){// 获取用户角色List<Role>roles=roleMapper.selectByUserId(userId);// 获取角色对应的菜单Set<Long>menuIds=newHashSet<>();for(Rolerole:roles){List<Menu>menus=menuMapper.selectByRoleId(role.getId());menus.stream().map(Menu::getId).forEach(menuIds::add);}// 构建菜单树returnbuildMenuTree(menuIds);}}

2. 数据权限

@ComponentpublicclassDataPermissionInterceptor{@AutowiredprivateDataScopeServicedataScopeService;@Around("@annotation(dataPermission)")publicObjectaround(ProceedingJoinPointpoint,DataPermissiondataPermission)throwsThrowable{// 获取用户数据权限范围DataScopescope=dataScopeService.getUserDataScope(getCurrentUserId());// 根据权限范围修改查询if(scope.getType()==DataScopeType.DEPT){// 只看本部门数据addDeptCondition(point,scope.getDeptIds());}elseif(scope.getType()==DataScopeType.SELF){// 只看自己创建的数据addSelfCondition(point,getCurrentUserId());}returnpoint.proceed();}}

六、总结

权限系统设计要点:

  • RBAC:简单易用,适合固定角色
  • ABAC:灵活复杂,适合精细控制
  • 菜单权限:控制可见性
  • 数据权限:控制数据范围

个人观点,仅供参考

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

Gemma-3-12B-IT多场景应用:技术面试模拟、简历优化、英文邮件润色

Gemma-3-12B-IT多场景应用&#xff1a;技术面试模拟、简历优化、英文邮件润色 1. 引言&#xff1a;你的全能AI职场助手 如果你正在准备技术面试&#xff0c;对着简历不知如何下笔&#xff0c;或者需要写一封专业得体的英文邮件却无从下手&#xff0c;那么今天介绍的这位“助手…

作者头像 李华
网站建设 2026/4/11 17:36:10

SOP与WI:从定义到实践的全方位解析

1. SOP与WI&#xff1a;企业高效运转的双引擎 第一次接触SOP和WI是在2013年负责某智能硬件生产线改造时。当时产线良品率始终徘徊在85%左右&#xff0c;经过三个月梳理&#xff0c;我们建立了完整的SOP体系配合可视化WI&#xff0c;最终将良品率提升到98.5%。这让我深刻认识到&…

作者头像 李华
网站建设 2026/4/11 17:33:07

Ubuntu 22 Server 直传百度网盘实战:成功可用的完整流程

我的目标很明确&#xff1a;把 Ubuntu 22 Server 上的数据直接上传到百度网盘&#xff0c;然后在 Windows 版百度网盘里下载。实际踩坑后&#xff0c;最终可用的方案是&#xff1a;不用账号密码直登类工具改用 bypy通过授权码绑定百度网盘把服务器文件上传到百度网盘的 我的应用…

作者头像 李华
网站建设 2026/4/13 20:31:16

如何快速将网页转为Markdown:终极浏览器扩展使用指南

如何快速将网页转为Markdown&#xff1a;终极浏览器扩展使用指南 【免费下载链接】markdownload A Firefox and Google Chrome extension to clip websites and download them into a readable markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/markdownload …

作者头像 李华
网站建设 2026/4/11 17:29:09

Plaquette:面向创意物理计算的信号流嵌入式开发框架

1. Plaquette 框架深度解析&#xff1a;面向创意物理计算的信号中心化嵌入式开发范式1.1 框架定位与工程价值Plaquette 并非传统意义上的传感器驱动库或实时控制中间件&#xff0c;而是一种以信号流为第一抽象层级的嵌入式编程范式重构。其核心工程价值在于&#xff1a;在保持 …

作者头像 李华