最近同事在研究Casbin的权限设计,我们主要是考虑使用ABAC基于属性的访问控制,Casbin给的示例不多,于是自己写了几个示例。

首先我们看看提到ABAC时,一般描述如下:

ABAC被一些人称为是权限系统设计的未来。

不同于常见的将用户通过某种方式关联到权限的方式,ABAC则是通过动态计算一个或一组属性来是否满足某种条件来进行授权判断(可以编写简单的逻辑)。属性通常来说分为四类:用户属性(如用户年龄),环境属性(如当前时间),操作属性(如读取)和对象属性(如一篇文章,又称资源属性),所以理论上能够实现非常灵活的权限控制,几乎能满足所有类型的需求。

例如规则:“允许所有班主任在上课时间自由进出校门”这条规则,其中,“班主任”是用户的角色属性,“上课时间”是环境属性,“进出”是操作属性,而“校门”就是对象属性了。为了实现便捷的规则设置和规则判断执行,ABAC通常有配置文件(XML、YAML等)或DSL配合规则解析引擎使用。

这里我们就以这个班主任上课进出校门为例,看看在Casbin下是如何实现的:

首先,我们定义用户环境和对象,操作我们就直接用字符串

type Person struct{Role stringName string
}
type Gate struct{Name string
}
type Env struct{Time time.TimeLocation string
}
func (env *Env) IsSchooltime() bool{return env.Time.Hour()>=8&&env.Time.Hour()<=18
}

接下来我们根据这个权限描述,我们可以写出如下的Casbin PERM模板:
[request_definition]
r = sub, obj, act, env[policy_definition]
p = sub, obj,act[policy_effect]
e = some(where (p.eft == allow))[matchers]
m = r.sub.Role=='Teacher' && r.obj.Name=='School Gate' && r.act in('In','Out') && r.env.Time.Hour >=8 && r.env.Time.Hour <= 18

因为我们给Env对象定义了IsSchooltime方法,所以我们也可以把目标写成如下,也是一样的效果:
[request_definition]
r = sub, obj, act, env[policy_definition]
p = sub, obj,act[policy_effect]
e = some(where (p.eft == allow))[matchers]
m = r.sub.Role=='Teacher' && r.obj.Name=='School Gate' && r.act in('In','Out') && r.env.IsSchooltime()

接下来我们构造两个人,一个是学生Yun,一个是老师Devin,构造两个门,一个是工厂大门,一个是学校大门,操作的方法我们就定义进门In和控制大门Control两个操作,环境上我们定义一个是早上9点,一个是晚上23点。
完整代码如下:
func TestTeacherEnterSchoolGate() {p1 := Person{Role: "Student", Name: "Yun"}p2 := Person{Role: "Teacher", Name: "Devin"}persons := []Person{p1, p2}g1 := Gate{Name: "School Gate"}g2 := Gate{Name: "Factory Gate"}gates := []Gate{g1, g2}const modelText = `
[request_definition]
r = sub, obj, act, env[policy_definition]
p = sub, obj,act[policy_effect]
e = some(where (p.eft == allow))[matchers]
m = r.sub.Role=='Teacher' && r.obj.Name=='School Gate' && r.act in('In','Out') && r.env.Time.Hour >7 && r.env.Time.Hour <= 18
`//m = r.sub.Role=='Teacher' && r.obj.Name=='School Gate' && r.act in('In','Out') && r.env.IsSchooltime()m := model.Model{}m.LoadModelFromText(modelText)e := casbin.NewEnforcer(m)envs := []*Env{InitEnv(9), InitEnv(23)}for _, env := range envs {fmt.Println("\r\nTime:",env.Time.Local())for _, p := range persons {for _, g := range gates {pass := e.Enforce(p, g, "In", env)fmt.Println(p.Role, p.Name, "In", g.Name, pass)pass = e.Enforce(p, g, "Control", env)fmt.Println(p.Role,p.Name, "Control", g.Name, pass)}}}
}func InitEnv(hour int) *Env{env:=&Env{}env.Time=time.Date(2019,8,20,hour,0,0,0,time.Local)return env
}

最后,输出结果如下:
Time: 2019-08-20 09:00:00 +0800 CST
Student Yun In School Gate false
Student Yun Control School Gate false
Student Yun In Factory Gate false
Student Yun Control Factory Gate false
Teacher Devin In School Gate true
Teacher Devin Control School Gate false
Teacher Devin In Factory Gate false
Teacher Devin Control Factory Gate falseTime: 2019-08-20 23:00:00 +0800 CST
Student Yun In School Gate false
Student Yun Control School Gate false
Student Yun In Factory Gate false
Student Yun Control Factory Gate false
Teacher Devin In School Gate false
Teacher Devin Control School Gate false
Teacher Devin In Factory Gate false
Teacher Devin Control Factory Gate false

我们可以看到,在上课时间早上9点,学生是禁止进出校门,而只有老师Devin的进校门操作被通过。而到了晚上23点,老师Devin也不允许进校门了。

这里需要注意的是,在一般的模板中,是没有env这个环境变量的,我把它加到了request_definition的最后面写成r = sub, obj, act, env,同时e.Enforce(sub,obj,act,env)需要按顺序传入4个参数。

我还会对Casbin的ABAC进一步的研究,各测试用例会发布到https://github.com/studyzy/abactest 有兴趣的可以看看。

最后,关于Casbin采用的规则引擎为,https://github.com/Knetic/govaluate,编辑Matchers规则可以参考:https://github.com/Knetic/govaluate/blob/master/MANUAL.md

转载于:https://www.cnblogs.com/studyzy/p/11380736.html

基于Casbin实现ABAC相关推荐

  1. 基于casbin的ABAC/RBAC权限实践

    五一假期疫情封在家也没事做,就想来优化一下一个前端容器小项目 之前的TODOlist里面有一项是权限这块时隔2年了还一直没有动手 迟迟没搞主要还是我太懒了,哈哈 其实我一直想要找一个轻量级的权限通用方 ...

  2. 多租户通用权限设计(基于 casbin)

    所谓权限控制, 概念并不复杂, 就是确认某个操作是否能做, 本质上仅仅就是个bool判断. 权限几乎是每个系统必不可少的功能, 和具体业务结合之后, 在系统中往往表现的非常复杂和难于控制, 很大部分原 ...

  3. Casbin之ABAC

    文章目录 Casbin之ABAC 1.model.conf文件 2.Policy.conf文件 3.main 4.输出及结构 5.讲解 Casbin之ABAC 1.model.conf文件 [requ ...

  4. Casbin-authz-plugin:基于Casbin的Docker权限管理、访问控制插件

    Docker是目前主流的一种容器技术.为了解决多用户同时访问Docker时产生的安全问题,Docker设计了访问控制插件(Authorization Plugin,见官方文档)这一机制,通过对Dock ...

  5. 基于属性的访问控制(ABAC)定义与思考 ——企业ABAC的实施问题

    本文整理了<Guide to Attribute Based Access Control (ABAC) Definition and Considerations>一文核心思想和观点的第 ...

  6. ABAC权限控制学习

    ABAC模型 什么是ABAC模式? ABAC是基于属性的访问控制,可以使用主体.客体或动作的属性,而不是字符串本身来控制访问. 您之前可能就已经听过 XACML ,是一个复杂的 ABAC 访问控制语言 ...

  7. 开源之夏 2022 重磅来袭,欢迎报名 Casbin社区项目

    01 活动简介 "开源之夏(英文简称 OSPP)" 是中科院软件所 "开源软件供应链点亮计划" 指导下的一项面向高校学生的暑期活动,由中国科学院软件研究所与 o ...

  8. 零信任架构和访问控制模型ABAC

    近几年,权限访问控制模型被反复提及,目前常用的是RBAC(Role-Based Access Control),RBAC是迄今为止最为普及的权限设计模型,其优点是简单,实现起来非常容易. 但是随着授权 ...

  9. 权限模型 DAC ACL RBAC ABAC

    访问控制方式 访问控制 介绍 自主访问控制(DAC,Discretionary Access Control) 强制访问控制 (MAC,Mandatory Access Control) 访问控制列表 ...

最新文章

  1. 打造最好用的离线QQ截图工具 C#
  2. 成功解决AttributeError: 'NoneType' object has no attribute '__array_interface__'
  3. java安装了为什么运行不了_安装jdk后运行javac可以运行,为什么不能运行java?...
  4. 计算机网络的拓扑结构主要有新型,计算机网络中主要拓扑结构有 ______。
  5. redis setnx 过期时间_阿里面试官:你确定你用过 Redis 分布式锁吗?
  6. 单源最短路 SPFA 算法模板
  7. C++Jump Search跳转搜索的实现算法(附完整源码)
  8. SpringBoot热部署之devtools案例(学习笔记)
  9. shouldParkAfterFailedAcquire
  10. git常用命令让你几步摆脱图形工具提交项目
  11. 浅拷贝直接赋值_Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)?...
  12. yum 查看安装的包 包含了哪些文件
  13. python上传文件到云服务器,python基于paramiko将文件上传到服务器代码实现
  14. 2022年建筑电工(建筑特殊工种)考试练习题及模拟考试
  15. Python-nan,NaN,NAN
  16. windbg加载符号
  17. 生于忧患,死于安乐。
  18. 《Adobe Premiere Pro CS5经典教程》——1.7 定制工作区
  19. Excel单元格设置下拉选项
  20. kaggle——Santander Customer Transaction Prediction

热门文章

  1. 刚刚涉险通过了微软sql server 2016 70-764的考试
  2. 矩阵分解方法总结(未完待续)
  3. 网络安全学习(千锋网络安全笔记)2--IP与基本DOS命令
  4. 万万没想到!电化学工作站操作如此简单
  5. 《电子基础与维修工具核心教程》——2.2 电阻的分类
  6. linux 证书文件权限,Linux运维之道之admin1.4(权限和归属,LDAP认证)
  7. 弯道超车老司机戏耍智能合约——竞态条件漏洞 | 漏洞解析连载之三
  8. 百度云盘搜索引擎微信公证号_微信公众号被百度搜索引擎收录?SEO优化诞生新方法!...
  9. Distantly Supervised NER with Partial Annotation Learning and Reinforcement Learning阅读笔记
  10. 测试晶面间距软件_Digital Micrograph实例教程(1):如何测量高分辨电镜图片中的晶面间距?...