系统设计 / 访问控制 · 从 RBAC 查表到 policy 判定函数 / action + 全部合起来 → 决策:规则冲突时,谁说了算 待审核 16 / 23
decide · rule + 组合算法

action + 全部合起来 → 决策:规则冲突时,谁说了算

四个输入齐了——授权请求装配的那个四元组——交给 PDP(Policy Decision Point)。policy 是一组 rule,每条要么 permit 要么 deny,各自带一个条件 when(req)。多条同时命中十分常见,如何收敛成一个结论?依靠组合算法(combining algorithm)。

1 · 一次完整的判定

资源调至 L2 以上或设备切为个人时,放行会附带 obligation——这就是为什么决策的返回值往往不是一个 bool,而是 { decision, obligations }

图 1-1 · 四个轴齐备后的一次判定:规则逐条点亮、算法选出决定性规则、盖下印章并附带 obligation。可调四个轴与组合算法,或一键载入冲突场景。

2 · 三种组合算法在同一请求上的分歧

组合算法不是细节,它本身就是一项策略决定。用上面那条当前请求同时运行三种算法——当 permit 和 deny 同时命中时,结果便会出现分歧。

图 2-1 · 当前请求在三种组合算法下的结论并排对照。上一个 lab 里载入冲突场景,此处三格即出现分歧。

注 · deny-overrides 最保守、最常用,安全场景默认它(有一条拒就拒)。first-applicable 使顺序等于优先级,如同防火墙规则链,可控但需谨慎处理规则排序。无论选哪种,都要配一个默认决策:本系列默认 deny(closed world,没人放行就拒)——这几乎总是对的,忘了写规则应该拒,而不是放。

建议 · obligation(附带义务)意味着 permit 不总是「干净地放行」。命中放行后,引擎还能附带要求——写审计日志、脱敏或水印展示。把它建模进返回值,比在业务代码里散落一堆「如果是机密就打水印」要可控得多。