Casbin 模型配置
Casbin 的精髓在于模型与实现的分离。你只需要定义「权限应该如何检查」的模型,然后用配置文件填充具体的策略——这就像给程序写规则,而不是写代码。
理解 Casbin 模型配置,是掌握 Casbin 的关键。
一、模型配置结构
1.1 完整配置示例
完整模型配置示例)
1.2 各节说明
二、ACL 模型
2.1 基础 ACL
最简单的访问控制模型:
basic_model.conf)
basic_policy.csv)
使用示例)
2.2 ACL 的局限性
ACL 简单直接,但问题也很明显:用户直接绑定权限,无法表达角色概念。
如果要给 100 个用户都授予「读取 data1」的权限,需要写 100 条策略。
三、RBAC 模型
3.1 标准 RBAC
引入角色层:
rbac_model.conf)
rbac_policy.csv)
使用示例)
3.2 多角色继承
角色可以继承其他角色:
rbac_hierarchy_model.conf)
rbac_hierarchy_policy.csv)
现在 ceo 继承所有角色的权限。
3.3 RBAC with Domain
支持多租户/域隔离:
rbac_with_dom_model.conf)
rbac_with_dom_policy.csv)
使用示例)
3.4 资源层级 RBAC
支持资源的层级关系:
rbac_with_hierarchy_model.conf)
rbac_hierarchy_policy.csv)
四、ABAC 模型
4.1 基础 ABAC
支持条件表达式:
abac_model.conf)
使用示例)
4.2 复杂 ABAC 条件
abac_complex_model.conf)
策略中的约束)
4.3 动态属性匹配
abac_resource_model.conf)
五、RESTful 模型
5.1 路径匹配
restful_model.conf)
restful_policy.csv)
使用示例)
5.2 HTTP 方法映射
HTTP
六、模型配置详解
6.1 Request Definition
定义权限检查的输入格式:
可以自定义变量名:
6.2 Policy Definition
定义策略的格式:
策略文件中的每一行对应一个 p 开头的记录:
6.3 Role Definition
定义角色继承关系:
6.4 Policy Effect
定义多条策略冲突时的效果:
允许覆盖)
优先拒绝)
允许且无拒绝)
6.5 Matchers
定义请求与策略的匹配逻辑:
七、模型配置验证
7.1 验证工具
模型验证)
7.2 常见配置错误
八、动态模型更新
8.1 运行时更新模型
动态模型更新)
8.2 模型版本控制
模型版本管理)
核心原则
Casbin 模型配置的核心是「匹配器」。理解 matchers 的写法,就掌握了 Casbin 的精髓。从简单到复杂,逐步演进你的模型。
思考题
问题 1:设计一个支持「资源层级」和「用户层级」的混合模型,使得:
- 父资源拥有权限时,子资源自动继承
- 上级角色拥有权限时,下级角色自动继承
参考答案
设计方案:
混合层级模型)
关键点:
objMatch函数支持前缀匹配g(r.sub, p.sub)处理用户层级继承p.act == "*"表示通配符操作
策略示例:
alice可以访问/department/finance/*(父资源通配)bob可以访问/department/*(子资源继承)
问题 2:如何在 Casbin 中实现「拒绝优先」机制,使得当存在拒绝策略时,无论有多少允许策略,最终结果都是拒绝?
参考答案
方案一:使用多层策略类型
Alice 虽然有 read 权限,但也有明确的拒绝策略,最终被拒绝。
方案二:使用 effect 字段
在策略中明确标记:
方案三:分离 allow/deny 表
- 如果存在任何 deny 匹配,拒绝
- 否则,如果有 allow 匹配,允许
- 否则,默认拒绝