跳转到主要内容

PBAC

什么是 PBAC?​

PBAC(基于策略的访问控制,Policy-Based Access Control) 依据 存储在策略中的规则 做授权决策,并在运行时用 eval() 求值。与固定的角色或属性检查不同,PBAC 可以表达复杂的、依赖上下文的条件。

策略可以包含:

  • 动态表达式 — 按请求逐个求值(例如 r.sub.Age >= 18)
  • 复杂逻辑 — 布尔与比较运算符、属性访问
  • 上下文 — 用户、资源和环境属性
  • 业务规则 — 领域相关的逻辑,写在策略中

模型​

[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() — 在 enforce 时求值这些表达式

示例​

基础策略​

策略:

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 会返回清晰的错误。