通用政策引擎實作
政策表示為一個目标和一個關聯的規則:
"<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"]]
最後,應該提到兩個特殊的政策檢查;政策檢查" @ "将始終接受通路,而政策檢查" !将永遠拒絕通路。(注意,如果一個規則是空清單([])或空字元串(""),這相當于“@”政策檢查。)其中,“!”政策檢查可能是最有用的,因為它允許顯式禁用特定規則。