Model 与常用配置文件
最后更新于:2022-04-02 03:07:16
[TOC]
## 常用配置文件
| Model | Model file | Policy file |
| --- | --- | --- |
| ACL | [basic\_model.conf](https://github.com/casbin/casbin/blob/master/examples/basic_model.conf) | [basic\_policy.csv](https://github.com/casbin/casbin/blob/master/examples/basic_policy.csv) |
| 具有超级用户的ACL | [basic\_model\_with\_root.conf](https://github.com/casbin/casbin/blob/master/examples/basic_with_root_model.conf) | [basic\_policy.csv](https://github.com/casbin/casbin/blob/master/examples/basic_policy.csv) |
| 没有用户的ACL | [basic\_model\_without\_users.conf](https://github.com/casbin/casbin/blob/master/examples/basic_without_users_model.conf) | [basic\_policy\_without\_users.csv](https://github.com/casbin/casbin/blob/master/examples/basic_without_users_policy.csv) |
| 没有资源的ACL | [basic\_model\_without\_resources.conf](https://github.com/casbin/casbin/blob/master/examples/basic_without_resources_model.conf) | [basic\_policy\_without\_resources.csv](https://github.com/casbin/casbin/blob/master/examples/basic_without_resources_policy.csv) |
| RBAC | [rbac\_model.conf](https://github.com/casbin/casbin/blob/master/examples/rbac_model.conf) | [rbac\_policy.csv](https://github.com/casbin/casbin/blob/master/examples/rbac_policy.csv) |
| 支持资源角色的RBAC | [rbac\_model\_with\_resource\_roles.conf](https://github.com/casbin/casbin/blob/master/examples/rbac_with_resource_roles_model.conf) | [rbac\_policy\_with\_resource\_roles.csv](https://github.com/casbin/casbin/blob/master/examples/rbac_with_resource_roles_policy.csv) |
| 支持域/租户的RBAC | [rbac\_model\_with\_domains.conf](https://github.com/casbin/casbin/blob/master/examples/rbac_with_domains_model.conf) | [rbac\_policy\_with\_domains.csv](https://github.com/casbin/casbin/blob/master/examples/rbac_with_domains_policy.csv) |
| RESTful | [keymatch\_model.conf](https://github.com/casbin/casbin/blob/master/examples/keymatch_model.conf) | [keymatch\_policy.csv](https://github.com/casbin/casbin/blob/master/examples/keymatch_policy.csv) |
1. ACL (Access Control List, 访问控制列表): 只有人员与权限,没有角色参与管理
1. RBAC (基于角色的访问控制)
1. 没有用户的 ACL: 对于没有身份验证或用户登录的系统尤其有用。
1. 没有资源的 ACL: 某些场景可能只针对资源的类型, 而不是单个资源, 诸如 write-article, read-log等权限。 它不控制对特定文章或日志的访问。
1. 支持资源角色的RBAC:资源也带上资源的角色
1. RESTful: 支持路径, 如 /res/*, /res/: id 和 HTTP 方法, 如 GET, POST, PUT, DELETE
## 说明
举例对 **rbac_model.conf** 的理解
```
# Request定义
[request_definition]
r = sub, obj, act
# 策略定义
[policy_definition]
p = sub, obj, act
# 角色定义
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
# 匹配器定义
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
```
说明
```
[request_definition]
定义请求由三部分组成 访问用户的用户 Subject , 访问的资源 Object 访问的动作 Action
[policy_definition]
定策略的格式 , 参数的基本意思和定义请求的相同 ,定义好了策略格式,那么对于策略(Policy)的具体描述可以存放在一个以 .csv 作为后缀的文件中
[role_definition]
是RBAC角色继承关系的定义 ,此处的 _, _ 表示 前项继承后项角色的权限
[policy_effect]
e = some(where (p.eft == allow)) : 表示任意一条Policy策略满足那么结果就为allow
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act : 定义了策略匹配者。匹配者是一组表达式。它定义了如何根据请求来匹配策略规则,匹配表达式的写法比较灵活根据具体需求来编写即可.
而此处的表达式意思是 ,检测用户角色 && 检测用户访问的资源 &&检测用户的动作 (&&表示并且关系,当然也有其他逻辑运算符 ||,!等)
```
对 **rbac_Policy_example.csv** 的说明
```
g, coder, root
g, zhangsan coder
p, root,api/v1/ping,GET
p, coder,api/v1/pong,GET
g, lisi, manager
p, manager, api/v1/user,POST
```
说明
```
coder是root的角色
zhangsan是coder的角色
root 可以访问 api/v1/ping 资源 通过GET动作,那么coder , zhangsan也可以访问
coder可以访问 api/v1/pong 资源 通过GET动作,zhangsan也能访问
lisi是manager的角色
manager可以访问 api/v1/user资源通过POST动作,lisi也可以访问
```
## 获取Model 的方式
### 从 .CONF 文件中加载 model
```
e := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")
```
### 从代码加载 model
```
import (
"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
"github.com/casbin/casbin/v2/persist/file-adapter"
)
// 从Go代码初始化模型
m := model.NewModel()
m.AddDef("r", "r", "sub, obj, act")
m.AddDef("p", "p", "sub, obj, act")
m.AddDef("g", "g", "_, _")
m.AddDef("e", "e", "some(where (p.eft == allow))")
m.AddDef("m", "m", "g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act")
// 从CSV文件adapter加载策略规则
// 使用自己的 adapter 替换。
a := fileadapter.NewAdapter("examples/rbac_policy.csv")
// 创建enforcer
e := casbin.NewEnforcer(m, a)
```
### 从字符串加载的 model
```
import (
"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
)
// 从字符串初始化模型
text :=
`
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
`
m, _ := model.NewModelFromString(text)
// 从CSV文件adapter加载策略规则
// 使用自己的 adapter 替换
a := fileadapter.NewAdapter("示例/rbac_policy.csv")
// 创建执行者。
e := casbin.NewEnforcer(m, a)
```
';