基于Casbin实现ABAC
最近同事在研究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()>=&&env.Time.Hour()<=
}
接下来我们根据这个权限描述,我们可以写出如下的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 > && r.env.Time.Hour <=
`
//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(), InitEnv()}
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(,,,hour,,,,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 false Time: 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
基于Casbin实现ABAC的更多相关文章
- 多租户通用权限设计(基于casbin)
多租户通用权限设计(基于 casbin) 所谓权限控制, 概念并不复杂, 就是确认某个操作是否能做, 本质上仅仅就是个bool判断. 权限几乎是每个系统必不可少的功能, 和具体业务结合之后, 在系统中 ...
- 基于casbin的RBAC权限实践
五一假期疫情封在家也没事做,就想来优化一下一个前端容器小项目 之前的TODOlist里面有一项是权限这块时隔2年了还一直没有动手 迟迟没搞主要还是我太懒了,哈哈 其实我一直想要找一个轻量级的权限通用方 ...
- [开源]Gin + GORM + Casbin+vue-element-admin 实现权限管理系统(golang)
简析 基于 Gin + GORM + Casbin + vue-element-admin 实现的权限管理系统. 基于Casbin 实现RBAC权限管理. 前端实现: vue-element-admi ...
- go-admin基于Gin + Vue + Element UI的前后端分离权限管理系统
✨ 特性 遵循 RESTful API 设计规范 基于 GIN WEB API 框架,提供了丰富的中间件支持(用户认证.跨域.访问日志.追踪ID等) 基于Casbin的 RBAC 访问控制模型 JWT ...
- go-admin在线开发平台学习-2[程序结构分析]
紧接着上一篇,本文我们对go-admin下载后的源码进行分析. 首先对项目所使用的第三方库进行分析,了解作者使用的库是否是通用的官方库可以有助于我们更快地阅读程序.接着对项目的main()方法进行分析 ...
- [开源]如何使用goapp写你的后台管理系统_golang
简析 基于 Gin + GORM + Casbin + vue-element-admin 实现的权限管理系统. 基于Casbin 实现RBAC权限管理. 前端实现: vue-element-admi ...
- PHP -Casbin: 支持 ACL、RBAC、ABAC 多种模型的 PHP 权限管理框架
PHP-Casbin 是一个用 PHP 语言打造的轻量级开源访问控制框架( https://github.com/php-casbin... ),目前在 GitHub 开源.PHP-Casbin 采用 ...
- Casbin权限模型
权限框架casbin1.概述Casbin是一个强大的.高效的开源访问控制框架,其权限管理机制支持多种访问控制模型. Casbin支持以下编程语言: Casbin可以做到:支持自定义请求的格式,默认的请 ...
- Casbin 使用记录
Casbin 是什么? 官方解释:Casbin是一个强大的.高效的开源访问控制框架,其权限管理机制支持多种访问控制模型. Casbin只负责访问控制.身份认证 authentication(即验证用户 ...
随机推荐
- JSP请求是如何被处理的?jsp的执行原理
客户端通过浏览器发送jsp请求,服务器端接受到请求后,判断是否是第一次请求该页面,或者该页面是否改变,若是,服务器将jsp页面翻译为servlet,jvm将servlet编译为.class文件,字节码 ...
- 《Java知识应用》Java加密方式(Base64)详解
1. 说明 Base64加密方式:比较简单,加密快,对普通大众可以起到加密的作用.在程序员眼中和透明一样. Base64应用场景:图片转码(应用于邮件,img标签,http加密) 2. 案例 impo ...
- 《Java基础知识》Java类与类之间的关系
类与类之间最常见的关系主要有三种:依赖(uses-a).聚合(has-a)和继承(is-a). 下面以在线书店订单系统为例,来详细的讲述这三种关系的概念. 在线书店订单系统的主要功能是:注册用户可以登 ...
- 【前端学习】网页tab键的实现 01
友情提醒:阅读本文需要了解一些基本的html/Css/Javascript知识 前端常用tab键的实现,用到的原理是当点击一个元素时,通过javascript操作css的display属性,达到控制另 ...
- CSS 解决z-index上层元素遮挡下层元素点击事件问题
解决z-index上层元素遮挡下层元素点击事件问题 by:授客 QQ:1033553122 开发环境 Win 10 element-ui "2.8.2" Vue 2.9.6 需求 ...
- Android 菜单 Menu
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to th ...
- 记一个AbstractMethodError
如下,引入FastJsonHttpMessageConverter 之后,导致了新的错误: @Override public void configureMessageConverters( List ...
- 50道Redis面试题史上最全,以后面试再也不怕问Redis了
1.什么是Redis? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存. ...
- Git实战指南----跟着haibiscuit学Git(第十一篇)
笔名: haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...
- Android数据库GreenDao的使用总结
一.GreenDao的介绍 GreenDAO是一个开源的Android ORM(“对象/关系映射”),通过ORM(称为“对象/关系映射”),节省了我们在数据库开发过程的时间! 通过GreenDao,我 ...