通用策略引擎实现
策略表示为一个目标和一个关联的规则:
"<target>": <rule>
目标特定于执行策略实施的服务。通常,目标引用一个API调用。
策略部分,参见策略规则表达式。
1.策略规则表达式
策略规则可以用两种形式之一表示:用新策略语言编写的字符串或列表。字符串格式是首选的,因为它对大多数人来说更容易理解。
在策略语言中,每个检查被指定为一个简单的“a:b”对,它匹配到执行该检查的正确类:
类型 | 语法 |
用户角色 | role:admin |
策略中定义的规则 | rule:admin_required |
URL检查 | http://my-url.org/check |
用户属性(通过token获取):user_id、domain_id或project_id | project_id:%(target.project.id)s |
字符串 | <variable>:’xpto2035abc’ ‘myproject’:<variable> |
文字 | project_id:xpto2035abc domain_id:20 True:%(user.enabled)s |
连接操作符and和or是可用的,允许在指定策略时更具表现力。
"role:admin or (project_id:%(project_id)s and role:projectadmin)"
策略语言也有not操作符,允许更丰富的策略规则:
"project_id:%(project_id)s and not role:dunce"
操作符优先级如下:
优先级 | 类型 | 表达式 |
4 | 组运算 | (...) |
3 | 否运算 | not ... |
2 | 与运算 | ... and ... |
1 | 或运算 | … or … |
具有较大优先数的运算符在其他具有较小优先数的运算符之前。
在list表示中,最内层列表中的每个检查都与“and”连接组合在一起—为了通过该检查,所有指定的检查都必须通过。这些最内层的列表然后与“或”连词组合在一起。举个例子,用列表中的列表表示如下规则:
[["role:admin"], ["project_id:%(project_id)s", "role:projectadmin"]]
最后,应该提到两个特殊的策略检查;策略检查" @ "将始终接受访问,而策略检查" !将永远拒绝访问。(注意,如果一个规则是空列表([])或空字符串(""),这相当于“@”策略检查。)其中,“!”策略检查可能是最有用的,因为它允许显式禁用特定规则。