很多的wiki权限也是这样的权限管理方式。

MAC(强制访问控制)

强制访问控制和DAC相反,它不将某些权限下放给用户,而是在更高维度(比如操作系统)上将所有的用户设置某些策略,这些策略是需要所有用户强制执行的。这种访问控制也是基于某些安全因素考虑。

casbin的基本使用

casbin使用配置文件来设置访问控制模型。我们可以通过casbin的模型编辑器来查看。

它有两个配置文件,model.conf 和 policy.csv。其中 model.conf 存储的是我们的访问控制模型,policy.csv 存储的是我们具体的用户权限配置。

权限本质上就是最终询问这么一个问题“某个用户,对某个资源,是否可以进行某种操作”。casbin的使用非常精炼。基本上就生成一个结构,Enforcer,构造这个结构的时候加载 model.conf 和 policy.csv。使用示例如下:

当然,casbin 可以读取具体 policy 的时候不仅仅可以通过 csv 文件进行读取,也可以通过数据库进行读取。这样我们甚至可以写一个用户管理后台来配置不同的用户权限。model.conf 也是可以从配置文件中获取,也可以从代码中获取,从代码中获取就可以扩展为先读取数据库,再代码加载。但是 model.conf 一旦修改,对应的 policy 就需要进行同步修改,所以 model 在一个系统中不要进行频繁修改。

PML

casbin 是一种典型的“配置即一切”的软件思路,那么它的配置语法就显得格外重要。我们可以通过 casbin 的在线配置编辑器 https://casbin.org/en/editor 来进行学习。

casbin 的理论基础是这么一篇论文:PML:一种基于Interpreter的Web服务访问控制策略语言 。这篇论文是北大的三个学生一起发表的。要理解 casbin 的配置文件,就需要先看这篇论文。

论文的作者觉得现在云计算时代,权限管理系统是各种云非常重要的组成部分,但是各种权限管理模型在各个云厂商,或者各种云时代的产品又都不一样。那么是否有一种权限模型来统一描述各种权限访问方式呢?如果有的话,这种权限模型又需要独立于各种语言而存在,才能被各种语言的云产品所通用。

于是论文就创造了这么一种语言:PML(PERM modeling language)。其中的 PERM 指的是 Policy-Effect-Request-Matcher 。下面我们需要一一了解每一个概念。

Request

Request 代表的是请求,它的写法是

比如我们写一行:

r = sub, obj, act

代表一个请求有三个标准的元素,请求主体,请求对象,请求操作。其中的sub, obj, act 可以是自己定义的,只要你在一个配置文件中定义的元素标识符一致就行。

Policy

Policy 代表策略,它表示具体的权限定义的规则是什么。

它同样是形如 p = sub, obj, act 的表示方法,比如我们定义了 policy 的规则如此,那么我们在 policy.csv 中每一行定义的 policy_rule 就必须和这个属性一一对应。

Policy_Rule

在 policy.csv 文件中定义的策略就是 policy_rule。它和 Policy 是一一对应的。

比如 policy 为

我设置的一条 policy_rule 为

表示Bob(p.sub = Bob)可以对data2 (p.obj = data2)进行 write (p.act = write) 操作这个规则。

policy 默认的最后一个属性为决策结果,字段名eft,默认值为allow,即通过情况下,p.eft就设置为allow。

Matcher

有请求,有规则,那么请求是否匹配某个规则,则是matcher进行判断的。

比如下面这个matcher :

表示当(r.sub == p.sub && r.obj == p.obj && r.act == p.act )的时候,返回true,否则返回false。

Effect

Effect 用来判断如果一个请求满足了规则,是否需要同意请求。它的规则比较复杂一些。

这里的 quantifier一般是some(论文中支持max和min),some表示括号中的表达式个数大于等于1就行。max/min表示括号中表达式的结果取最大/小的。(这里我不是很理解,不过好像casbin也没有实现min和max)

下面这个例子:

这句话的意思就是将 request 和所有 policy 比对完之后,所有 policy 的策略结果(p.eft)为allow的个数 >=1,整个请求的策略就是为 true。

自定义函数

自定义函数是在 matcher 中使用的。我们可以自己定义一个函数,然后注册进enforcer,在matcher中我们就可以使用了。

比如

casbin中有一些自定义的函数: