最近同事在研究Casbin的权限设计,我们主要是考虑使用ABAC基于属性的访问控制,Casbin给的示例不多,于是自己写了几个示例。
首先我们看看提到ABAC时,一般描述如下:
ABAC被一些人称为是权限系统设计的未来。
不同于常见的将用户通过某种方式关联到权限的方式,ABAC则是通过动态计算一个或一组属性来是否满足某种条件来进行授权判断(可以编写简单的逻辑)。属性通常来说分为四类:用户属性(如用户年龄),环境属性(如当前时间),操作属性(如读取)和对象属性(如一篇文章,又称资源属性),所以理论上能够实现非常灵活的权限控制,几乎能满足所有类型的需求。
例如规则:“允许所有班主任在上课时间自由进出校门”这条规则,其中,“班主任”是用户的角色属性,“上课时间”是环境属性,“进出”是操作属性,而“校门”就是对象属性了。为了实现便捷的规则设置和规则判断执行,ABAC通常有配置文件(XML、YAML等)或DSL配合规则解析引擎使用。
这里我们就以这个班主任上课进出校门为例,看看在Casbin下是如何实现的:
首先,我们定义用户环境和对象,操作我们就直接用字符串
type Person struct{ Role string Name string } type Gate struct{ Name string } type Env struct{ Time time.Time Location string } func (env *Env) IsSchooltime() bool{ return env.Time.Hour()>=8&&env.Time.Hour()<=18 }
接下来我们根据这个权限描述,我们可以写出如下的Casbin PERM模板:
[request_definition] r = sub, obj, act,