基于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(即验证用户 ...
随机推荐
- 一线互联网公司Redis使用精髓,你必须要掌握这4点!
先来看一下这些Redis面试题你会几道? 1.什么是 Redis?简述它的优缺点? 2.Redis 与 memcached 相比有哪些优势? 3.Redis 支持哪几种数据类型? 4.Redis 主要 ...
- 信道估计之LS
在无线通信系统中,系统的性能主要受到无线信道的制约.基站和接收机之间的传播路径复杂多变,从简单的视距传输到受障碍物反射.折射.散射影响的传播.在无线传输环境中,接收信号会存在多径时延,时间选择性衰落和 ...
- 2019年终总结:10场演讲、内推20人、公众号2万粉丝、Code Runner 1000万下载
2019年是值得记录的一年,成长许多,也收获许多. 做了 10 场大会的技术演讲,成功内推 20 人拿到微软 Offer,知乎 Live 2000 听众,公众号 2 万粉丝,GitHub 2万 sta ...
- Mysql添加path变量
前提: 系统环境:Linux,服务器:阿里云轻量应用服务器 背景: 阿里云轻量应用服务器自带 mysql5.7,但是没有配置环境变量,因此直接输入 mysql -u root -p 将提示 comma ...
- webpack前端简单配置
每次用webpack创建项目时,总是要安装一堆包,还要配置一系列文件解析规则,webpack打包规则等,烦不胜烦.网上找的很多webpack配置里面很多里面的配置或者引入包都是被弃用的,因此自己总结了 ...
- Python基础-day02-2
运算符 目标 算数运算符 比较(关系)运算符 逻辑运算符 赋值运算符 运算符的优先级 数学符号表链接:https://zh.wikipedia.org/wiki/数学符号表 01. 算数运算符 是完成 ...
- iOS编译自动升级版本号脚本
版权申明: 本文原创首发于以下网站,您可以自由转载,但必须加入完整的版权声明 博客园:https://www.cnblogs.com/MogooStudio/ csdn博客:https://blog. ...
- LL(1)文法的判断,递归下降分析程序
1. 文法 G(S): (1)S -> AB (2)A ->Da | ε (3)B -> cC (4)C -> aADC | ε (5)D -> b | ε 验证文法 G ...
- mariadb 学习笔记
安装:yum install mariadb-server mariadb vim /etc/my.cnf.d/server.cnfinnodb_file_per_table = on#设置后当创建数 ...
- Flutter - flutter desktop embedding / flutter 桌面支持
2019年5月9日,随着谷歌在IO19宣布Flutter支持Web平台,就标志着Flutter已经全面支持所有平台(移动.网页.桌面.嵌入式). 现编一个跨平台小段子: 微软Xarmarin:喵喵喵? ...