Effector
Effect(效果) 是一条 policy 规则的结果(允许或拒绝)。Effector 接口定义了 enforcer 如何将多个匹配到的效果合并为一个最终决策。
MergeEffects()
MergeEffects() 接收所有已匹配 policy 产生的效果,并生成一个最终的允许/拒绝结果。
Effect, explainIndex, err = e.MergeEffects(expr, effects, matches, policyIndex, policyLength)
参数:
| 参数 | 说明 |
|---|---|
expr | policy 的效果表达式字符串(例如来自 model)。 |
effects | 效果切片:Allow、Deny 或 Indeterminate。 |
matches | 哪些 policy 索引发生了匹配。 |
policyIndex | 当前 policy 索引。 |
policyLength | policy 的总数。 |
返回值:
- Effect —— 最终决策(
Allow、Deny或Indeterminate)。 - explainIndex —— 决定该结果的 policy 索引(不适用时为
-1)。 - err —— 如果 effector 不支持该表达式,则非 nil。
使用自定义 Effector:
var e Effector
Effect, explainIndex, err = e.MergeEffects(expr, effects, matches, policyIndex, policyLength)
对于标准的 allow-override(允许优先)效果,只要有一条匹配的 policy 允许、且没有任何一条拒绝,结果即为允许。自定义 effector 可以实现其他语义(例如 deny-override(拒绝优先)、优先级)。
备注
除非效果表达式是 priority(p_eft) || deny, 否则 enforcer 可能会短路:一旦结果确定,剩余的 policy 就不再求值。因此当 policyIndex < policyLength-1 时,某些效果可能会被跳过。