跳转到主要内容

使用控制(UCON)

概述​

UCON(Usage Control,使用控制) 在访问控制的基础上扩展出了 授权(Authorizations,A)、义务(Obligations,B) 和 条件(Conditions,C)。它支持在使用期间进行持续执行(而不仅仅是在访问时执行一次),并支持可变属性。Casbin 并未在核心中实现 UCON;如需基于会话的使用控制,请使用 casbin-ucon 扩展。

模型与策略​

注意:Casbin 核心库并不直接支持 UCON。UCON 功能是通过扩展库 casbin-ucon 提供的,该扩展在 Casbin 核心能力之上增加了基于会话的访问控制,支持条件、义务和持续监控。该扩展可以使用 Casbin 核心所支持的相同 model 和 policy。

model​

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

policy​

p, alice, document1, read

注意:在 UCON 中,Conditions 和 Obligations 不写在 policy.csv 中;它们通过 casbin-ucon 的 API 在代码里添加和管理。

核心组件​

  • 授权(Authorizations,A) —— 基于主体/客体属性的访问规则(与标准 Casbin 类似)。
  • 义务(Obligations,B) —— 主体在使用前或使用期间必须执行的操作(例如记录日志、确认)。
  • 条件(Conditions,C) —— 必须被满足的环境或系统状态(例如时间、位置)。

特性​

  • 持续执行 —— 在整个使用会话期间进行检查,而不仅仅是在开始时检查一次。
  • 可变性 —— 属性可以因为使用过程本身而发生变化。
  • 事前 / 事中 / 事后 —— 分别在访问时、使用期间和使用后做出决策并履行义务。

适用场景​

UCON 模型在以下场景中尤其有价值:

  • 数字版权管理(DRM)系统
  • 医疗信息系统
  • 云计算环境
  • IoT 设备访问控制
  • 协作环境中的数据共享
  • 具有复杂合规要求的金融系统

使用 casbin-ucon 实现​

要在基于 Casbin 的应用中实现 UCON,请使用 casbin-ucon 扩展库:

go get github.com/casbin/casbin-ucon
// Import the required packages
import (
"github.com/casbin/casbin/v3"
"github.com/casbin/casbin-ucon"
"fmt"
"time"
)

func main() {
// Create standard Casbin enforcer
e, _ := casbin.NewEnforcer("model.conf", "policy.csv")

// Wrap with UCON functionality
uconE := ucon.NewUconEnforcer(e)

// Add conditions
condition := &ucon.Condition{
ID: "location_condition",
Name: "location",
Kind: "always",
Expr: "office",
}
uconE.AddCondition(condition)

// Add obligations
obligation := &ucon.Obligation{
ID: "post_log",
Name: "access_logging",
Kind: "post",
Expr: "log_level:detailed",
}
uconE.AddObligation(obligation)

// Create a session
sessionID, _ := uconE.CreateSession("alice", "read", "document1", map[string]interface{}{
"location": "office",
"log_level": "detailed",
})

// UCON session-based enforcement
session, err := uconE.EnforceWithSession(sessionID)
if session == nil {
// refused
fmt.Println("session refused because: ", err)
}

// Monitor session status
go func() {
for {
if !session.IfActive() {
if session.GetStopReason() == ucon.NormalStopReason {
break
}
//TODO
//decide how to handle session termination yourself
// For example, clean up resources, close connections, write logs, notify the frontend, etc.
fmt.Printf("%s %s %s is stopped because: %s\n",
session.GetSubject(), session.GetAction(),
session.GetObject(), session.GetStopReason())
break
}
time.Sleep(200 * time.Millisecond)
}
}()

// You can update attributes during the session
// session.UpdateAttribute("location", "home")

// Stop the session when done
_ = uconE.StopMonitoring(sessionID)
}

实现要点​

  • UCON 涵盖了 MAC、DAC、RBAC 等传统访问控制模型
  • 实现需要一个能够持续监控的引用监视器(reference monitor)
  • 属性更新(可变性)应当以原子方式处理,以保持一致性
  • 义务的履行可能需要与外部监控系统集成
  • 条件的判断可能依赖于访问控制系统之外的环境因素
  • 使用 casbin-ucon 时,需要正确管理会话的生命周期和监控

与传统模型的对比​

方面传统访问控制UCON
决策时机仅在访问前访问前、访问中和访问后
属性可变性静态动态(可在使用过程中更改)
决策因素仅授权授权、义务和条件
执行方式一次性检查持续监控
撤销显式可基于属性变化自动执行

参考资料​

关于 casbin-ucon 的完整 API 文档、详细用法和最新更新,请参阅 casbin-ucon。