策略决策不是魔法,是棵树
底层其实没啥新鲜玩意儿——就是一棵决策树,或者一个布尔表达式求值器。用标准语言说,这叫策略组合算法+规则评估逻辑。比方说:允许主治医生在8:00-18:00修改自己科室的病历。这条规则拆开:角色=主治医生,时间=8:00-18:00,资源类型=病历,资源科室=用户科室,操作=修改。每个属性对应一个判断节点,全局结果由AND/OR串起来。
一次压测把我吓出冷汗
三年前我给一个电商平台做权限改造。原来用RBAC,角色数膨胀到5万多个——没错,五万。每次新业务就得加角色,DBA都快哭了。换成ABAC后,我们把角色打散成属性:部门、职级、项目、地区……策略数最终只有217条。清爽吧?第一版上线,登录延迟从原来的2毫秒飙到87毫秒。用户直接投诉。 查了半天才发现,每次鉴权得调4个外部服务,平均延迟加起来40ms,还有属性计算、策略解析,总耗时轻松破50ms。后来我们做了三件事:一,给用户属性搞了二级缓存(TTL 5分钟);二,把资源属性在鉴权请求里直接传(反正前端已经拿到了);三,策略编译成前缀树,避免重复计算。压测结果:延迟降回9毫秒,QPS从 1200飙到 8600。
三个让你怀疑人生的坑
坑1:属性元数据熵增 相信我,业务部门定义属性的想象力远超你的预期。同一个“地区”,销售部写“华东”,物流部写“SH”,财务部写成“30”。没有统一的元数据中心,策略逻辑直接崩。有一次一个HR请求因为“职级”字段拼错,直接绕过权限看到了全公司薪资——差点出大篓子。 解法:必须建立属性字典,强制枚举值。所有属性变更走审批,属性名称用JSON Schema校验。最重要的是,要求PIP返回的属性附带来源ID,方便追溯。搞个属性治理平台虽然前期累,但比事后擦屁股强一百倍。 坑2:策略冲突的幽灵 多策略组合时,允许+拒绝的冲突是家常便饭。默认的“允许覆盖”或“拒绝优先”在某些场景下都会出错。我见过最离谱的案例:一条策略说“允许查看自己部门数据”,另一条说“禁止查看高密级项目”,结果项目经理自己都看不了项目文档——因为“高密级”判断优先级更高,把允许覆盖了。 解法:引入策略优先级和显式合并算法。别偷懒只用顺序组合。用XACML里的作者|大讲堂
排版|大讲堂
审核|小北
大讲堂