跳转到主要内容

Effector

Effect(效果) 是一条 policy 规则的结果(允许或拒绝)。Effector 接口定义了 enforcer 如何将多个匹配到的效果合并为一个最终决策。

MergeEffects()​

MergeEffects() 接收所有已匹配 policy 产生的效果,并生成一个最终的允许/拒绝结果。

Effect, explainIndex, err = e.MergeEffects(expr, effects, matches, policyIndex, policyLength)

参数:

参数说明
exprpolicy 的效果表达式字符串(例如来自 model)。
effects效果切片:Allow、Deny 或 Indeterminate。
matches哪些 policy 索引发生了匹配。
policyIndex当前 policy 索引。
policyLengthpolicy 的总数。

返回值:

  • 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 时,某些效果可能会被跳过。