ABAC 权限策略扩展
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 {@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {return null; // ABAC 不依赖静态权限}@Overridepublic 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"whenuserRole == "finance" &&resourceType == "FINANCE_SYSTEM" &¤tTime >= "09:00" && currentTime <= "18:00" &&dayOfWeek not in ("SATURDAY", "SUNDAY")thendecision = true; end
-
跨部门协作
// 策略:仅同项目组成员可编辑文档 rule "DocumentEdit"whenaction == "document:edit" &&userProject == resourceProject && userSecurityLevel >= resourceMinLevelthendecision = true; end
-
地理位置限制
// 策略:仅公司内网可访问敏感数据 rule "SensitiveDataAccess"whenresourceSensitivity > 3 &&ipAddress in ("192.168.1.0/24", "10.0.0.0/8")thendecision = true; end
-
多因素组合(医疗系统场景)
// 策略:仅主治医生在值班时可修改危重病人数据 rule "CriticalPatientUpdate"whenuserRole == "DOCTOR" &&userTitle == "CHIEF_PHYSICIAN" &&resourceTag == "CRITICAL_PATIENT" &&shiftStatus == "ON_DUTY" &¤tTime between ("08:00", "20:00")thendecision = 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 嵌入权限检查流程
其核心价值在于解决跨系统权限协调、动态策略调整和细粒度控制三大难题,特别适用于医疗、金融、物联网等复杂业务场景。