什么是 PBAC?Casbin 中的基于策略的访问控制
什么是 PBAC?
基于策略的访问控制 (PBAC) 将授权规则保留为策略 数据,与应用代码分离,并在运行时进行评估。更改谁可以做什么意味着编辑策略,而不是发布新版本,这就是为什么当安全或合规团队负责规则时,通常会选择 PBAC。
在 Casbin 中,PBAC 意味着将规则表达式存储在策略行中,并使用 eval() 进行评估。与模型中固定的角色或属性检查不同,每个策略行都可以携带其自身的条件。
策略可以包含:
- 动态表达式:针对每个请求进行评估(例如
r.sub.Age >= 18) - 复杂逻辑:布尔和比较运算符,属性访问
- 上下文:用户、资源和环境属性
- 业务规则:策略中的特定领域逻辑
PBAC vs ABAC vs RBAC
RBAC 和 ABAC 描述了决策基于什么:角色或属性。PBAC 描述了规则是如何管理的:作为策略在运行时评估。两者存在重叠。本页面的示例是将 ABAC 条件作为 PBAC 进行管理,而 Casbin RBAC 策略也是可以在运行时更改的数据。在实践中,“PBAC”通常用于指代那些不仅分配关系,而且规则逻辑本身也存在于策略中的系统。选择访问控制模型 在一个示例上比较了这些模型。
模型
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub_rule, obj_rule, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = eval(p.sub_rule) && eval(p.obj_rule) && r.act == p.act
p.sub_rule/p.obj_rule— 关于请求的表达式(例如r.sub.Age >= 18,r.obj.Level >= 1)eval()— 在执行时评估这些表达式
示例
基本策略
策略:
p, r.sub.Age >= 18, r.obj.Level >= 1, play
请求示例:
{"Age":25}, {"Level":2}, play # ALLOWED (Age >= 18 and Level >= 1)
{"Age":16}, {"Level":2}, play # DENIED (Age < 18)
{"Age":20}, {"Level":0}, play # DENIED (Level < 1)
{"Age":25}, {"Level":2}, read # DENIED (action doesn't match policy)
复杂策略
策略:
p, r.sub.Department == "IT" && r.sub.Level >= 3, r.obj.Confidential == false, read
请求示例:
{"Department":"IT","Level":3}, {"Confidential":false}, read # ALLOWED
{"Department":"IT","Level":2}, {"Confidential":false}, read # DENIED (Level < 3)
{"Department":"HR","Level":3}, {"Confidential":false}, read # DENIED (Department != "IT")
{"Department":"IT","Level":3}, {"Confidential":true}, read # DENIED (Confidential == true)
代码示例:
e, _ := NewEnforcer("examples/pbac_model.conf", "examples/pbac_policy.csv")
// Enable JSON request support
e.EnableAcceptJsonRequest(true)
// Define subject and object with attributes
subject := `{"Department": "IT", "Level": 3}`
object := `{"Confidential": false}`
action := "read"
// Check permission
ok, err := e.Enforce(subject, object, action)
if err != nil {
fmt.Printf("Enforcement error: %v\n", err)
return
}
if ok {
fmt.Println("Permission granted")
} else {
fmt.Println("Permission denied")
}
启用 EnableAcceptJsonRequest(true) 后,看起来像 JSON 的参数({ 或 [)会被自动解析;无效的 JSON 会返回清晰的错误信息。
Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.