ABAC 权限策略扩展:原理、实现与应用场景
一、ABAC 核心原理
ABAC(Attribute-Based Access Control)是一种基于主体属性、客体属性、操作属性和环境属性的动态访问控制模型。其决策机制可表示为:
决策=f(主体,客体,操作,环境)
\text{决策} = f(\text{主体}, \text{客体}, \text{操作}, \text{环境})
决策=f(主体,客体,操作,环境)
四维属性模型:
二、Shiro 扩展实现原理
在 Shiro 中实现 ABAC 需扩展三大组件:
-
属性收集器
动态获取四维属性数据public class ABACAttributeCollector { public Map<String, Object> collectAttributes(Subject subject, Object resource) { Map<String, Object> attrs = new HashMap<>(); // 主体属性 attrs.put("userRole", subject.getRole()); // 客体属性 attrs.put("resourceSensitivity", resource.getSensitivityLevel()); // 环境属性 attrs.put("accessTime", LocalDateTime.now()); return attrs; } } -
策略解析引擎
使用规则引擎(如 Drools)解析策略public class ABACPolicyEngine { public boolean checkPermission(Map<String, Object> attributes, String action) { KieSession kieSession = kieContainer.newKieSession(); kieSession.insert(attributes); kieSession.insert(new ActionRequest(action)); kieSession.fireAllRules(); return attributes.get("decision") == Boolean.TRUE; } } -
自定义 Realm
集成属性收集与策略决策public class ABACRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return null; // ABAC 不依赖静态权限 } @Override public boolean isPermitted(PrincipalCollection principals, String permission) { Subject subject = SecurityUtils.getSubject(); Object resource = getResourceFromPermission(permission); // 从权限字符串解析资源 Map<String, Object> attrs = attributeCollector.collectAttributes(subject, resource); return policyEngine.checkPermission(attrs, permission); } }
三、典型应用场景
-
动态时间控制
// 策略:仅工作日9:00-18:00可访问财务系统 rule "FinanceAccessTime" when userRole == "finance" && resourceType == "FINANCE_SYSTEM" && currentTime >= "09:00" && currentTime <= "18:00" && dayOfWeek not in ("SATURDAY", "SUNDAY") then decision = true; end -
跨部门协作
// 策略:仅同项目组成员可编辑文档 rule "DocumentEdit" when action == "document:edit" && userProject == resourceProject && userSecurityLevel >= resourceMinLevel then decision = true; end -
地理位置限制
// 策略:仅公司内网可访问敏感数据 rule "SensitiveDataAccess" when resourceSensitivity > 3 && ipAddress in ("192.168.1.0/24", "10.0.0.0/8") then decision = true; end -
多因素组合(医疗系统场景)
// 策略:仅主治医生在值班时可修改危重病人数据 rule "CriticalPatientUpdate" when userRole == "DOCTOR" && userTitle == "CHIEF_PHYSICIAN" && resourceTag == "CRITICAL_PATIENT" && shiftStatus == "ON_DUTY" && currentTime between ("08:00", "20:00") then decision = true; end
四、策略执行优化
-
决策缓存机制
-
分布式策略执行
通过 API 网关统一处理策略决策:@RestController public class PolicyController { @PostMapping("/policy/check") public PolicyResponse check(@RequestBody PolicyRequest request) { // 分布式策略决策服务 return policyService.evaluate(request); } }
五、与传统模型对比
| 特性 | RBAC | ABAC |
|---|---|---|
| 控制粒度 | 角色级 | 属性级 |
| 动态性 | 静态权限分配 | 实时动态决策 |
| 策略复杂度 | 简单角色映射 | 多维度条件组合 |
| 适用场景 | 固定权限体系 | 复杂业务规则 |
| 维护成本 | 用户角色变更频繁 | 策略集中管理 |
六、实施建议
-
分阶段迁移
-
策略管理最佳实践:
- 使用策略版本控制(Git管理策略文件)
- 开发策略模拟测试工具
- 建立策略影响度分析机制
- 设置策略变更审批流程
-
性能监控指标:
操作首次决策(ms)缓存命中(ms)简单策略15±32±0.5复杂策略85±125±1跨服务调用120±208±2 \begin{array}{|c|c|c|} \hline \text{操作} & \text{首次决策(ms)} & \text{缓存命中(ms)} \\ \hline \text{简单策略} & 15 \pm 3 & 2 \pm 0.5 \\ \hline \text{复杂策略} & 85 \pm 12 & 5 \pm 1 \\ \hline \text{跨服务调用} & 120 \pm 20 & 8 \pm 2 \\ \hline \end{array} 操作简单策略复杂策略跨服务调用首次决策(ms)15±385±12120±20缓存命中(ms)2±0.55±18±2
总结
ABAC 通过四维属性模型实现动态细粒度的访问控制,在 Shiro 中扩展需构建:
- 属性收集体系 - 实时获取主体/客体/环境/操作属性
- 策略引擎集成 - 使用规则引擎解析复杂条件
- 决策执行机制 - 通过自定义 Realm 嵌入权限检查流程
其核心价值在于解决跨系统权限协调、动态策略调整和细粒度控制三大难题,特别适用于医疗、金融、物联网等复杂业务场景。
思维导图

3562

被折叠的 条评论
为什么被折叠?



