合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
[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) ```