ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
策略(Policy) 控制模型(model) **安装** ~~~ composer require casbin/casbin ~~~ 实例化 ``` require_once './vendor/autoload.php'; use Casbin\Enforcer; //$e = new Enforcer("path/to/model.conf", "path/to/policy.csv"); //分别是模型文件和策略文件 $e = new Enforcer("rbac_model.conf", "rbac_policy.csv"); ``` ## **rbac_model.conf** 访问控制模型被抽象为基于**PERM (Policy, Effect, Request, Matcher)**的一个文件 可以通过组合可用的模型来定制您自己的访问控制模型。 例如,您可以在一个model中获得RBAC角色和ABAC属性,并共享一组policy规则 ``` # 用于request的定义,它明确了`e.Enforce(...)`函数中参数的含义 //# sub, obj, act表示经典三元组: 访问实体 (Subject),访问资源 (Object) 和访问方法 (Action)。 //但是, 你可以自定义你自己的请求表单, 如果不需要指定特定资源,则可以这样定义`sub、act`, //或者如果有两个访问实体, 则为`sub、sub2、obj、act`。 [request_definition] r = sub, obj, act //# 对policy(策略)的定义,这里配置的规则以rbac_policy.csv的 model 配置为例 [policy_definition] # 规则(策略)1 p = sub, obj, act # 规则(策略)2 p2 = sub, act [role_definition] g = _, _ g2 = _, _ //# policy_effect是对policy生效范围的定义, // 原语定义了当多个policy rule同时匹配访问请求request时,该如何对多个决策结果进行集成以实现统一决策 //描述如果找到匹配的多条的授权policy,最终给出的验证授权结果, //如下面的定义说明只要有一条匹配的授权策略其`eft`是`allow`,则最终给出的验证授权结果就是`allow`(注意每条授权policy默认的eft就是allow) [policy_effect] // # 只有一条规则生效,其余都被拒绝的情况 更多规则查看下面的表格 e = some(where (p.eft == allow)) //e = !some(where (p.eft == deny)) //e = some(where (p.eft == allow)) && !some(where (p.eft == deny)) //e = priority(p.eft) || deny //是策略匹配器的定义。匹配器(matchers)是表达式。描述的是根据访问请求如何找到匹配的授权policy [matchers] //下面的匹配器是最简单的,它意味着request_definition定义的请求中的subject、object和action应该与policy_definition中定义策略规则中p规则相匹配。 //m = r.sub == p.sub && r.obj == p.obj && r.act == p.act //这里加入了role_definition定义的角色 m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act //您可以使用算术运算符,如+, -, \*, /和逻辑运算符,如&&, ||, !匹配器。 ``` ## **rbac_policy.csv**策略规则配置文件 rbac_model.conf里policy_definition定义了策略,这里我们对定义的策略进行配置 policy部分的每一行称之为一个策略规则, 每条策略规则通常以形如`p`,`p2`的`policy type`开头。 如果存在多个policy定义,那么我们会根据前文提到的`policy type`与具体的某条定义匹配。 上面的policy的绑定关系将会在rbac_model.conf里的matcher中使用 ``` //# alice可以读取data1 p, alice, data1, read //# bob可以编写data2 p, bob, data2, write p, data2_admin, data2, read p, data2_admin, data2, write g, alice, data2_admin p2, bob, write-all-objects ``` 支持的内置策略如下 | 策略规则| 含义| 例子| | --- | --- | --- | | some(where (p.eft == allow)) | allow-override | [ACL, RBAC, etc.](https://casbin.org/docs/en/supported-models#examples) | | !some(where (p.eft == deny)) | deny-override | [Deny-override](https://casbin.org/docs/en/supported-models#examples) | | some(where (p.eft == allow)) && !some(where (p.eft == deny)) | allow-and-deny | [Allow-and-deny](https://casbin.org/docs/en/supported-models#examples) | | priority(p.eft) \|\| deny | priority | [Priority](https://casbin.org/docs/en/supported-models#examples) | 在访问发生之前, 在代码中添加强制挂钩: ~~~ $sub = "alice"; // 想要访问资源的用户。 $obj = "data1"; // 要访问的资源。 $act = "read"; // 用户对资源执行的操作。 if ($e->enforce($sub, $obj, $act) === true) { // 允许alice读取data1 } else { // 拒绝请求,显示错误 } ~~~ 除了静态策略文件之外, Casbin 还为运行时的权限管理提供 API。例如, 您可以将分配给用户的所有角色按如下所示进行: ~~~ $roles = $e->getRolesForUser("alice"); ~~~