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