casbin 权限管理库介绍 (规范实现 acl, rbac,abac)等

2024-02-18 11:44

本文主要是介绍casbin 权限管理库介绍 (规范实现 acl, rbac,abac)等,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Casbin介绍

日常开发中我们经常需要设计用户对资源的访问权限控制。我发现手动设计模型、数据库表定义很不规范, 所以进行了一些调研。我发现casbin这个库很大程度上实现了标准化的需求, 牛刀小试引入了公司的一个需求中, 感觉开发效率确实很高, 所以博客分享一下。

Casbin是一款开源的访问控制框架,它使用简单的表达式语言来定义各种访问控制模型(RBAC)和访问控制策略。开发人员可以使用这些策略来限制用户对系统中的资源的访问。

优点:

  • 灵活性高:支持实现各种访问控制模型(RBAC、ABAC等),模型升级方便
  • 规范化:避免手工编码权限规则和策略,无需从头设计数据库表结构,可以使用适配器将访问策略保存到mysql、redis、etcd等
  • 多语言支持 : Go, python, node, Java, etc
  • 支持规则匹配符(匹配路由等)
  • 支持多层角色继承
  • 支持多租户: 如将工作空间视为一个租户
  • 前后端一致

不足:

  • 规则书写没有可视化编辑界面、需要手动对双引号进行转义等

ACL模型

模型文件定义如下

# model.conf 文件
[request_definition]
r = sub, obj,act
# 请求格式定义,表示sub对obj执行act, 定义 Enforce 请求授权函数的参数[policy_definition]
p = sub, obj, act
# 策略格式定义, 和策略文件中的策略对应[policy_effect]
e = some(where (p.eft == allow))
# 表示当多个策略匹配请求时, 怎么确定是否允许访问
# 这里 e = some(where (p.eft == allow))表示只要有一条策略允许访问, 最终的结果就是允许[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
# 匹配器,当执行访问请求时,匹配对应的策略

创建策略文件

# policy.csv
p, alice, data1, read
p, bob, data2, write

这个策略文件定义了两个规则。第一个规则指定Alice可以读取data1,第二个规则指定Bob可以写入data2。

加载策略文件

e, err := casbin.NewEnforcer("path/to/policy/file", "path/to/model/file")

这将创建一个新的Casbin实例,并将策略文件和模型文件加载到该实例中。

检查访问权限
下面的代码将检查Alice是否有权读取data1:

if e.Enforce("alice", "data1", "read") {fmt.Println("Alice can read data1")
} else {fmt.Println("Alice cannot read data1")
}

这将输出“Alice can read data1”,因为Alice在策略文件中被授权读取data1。
修改策略

added := e.AddPolicy('eve', 'data3', 'read')
e.SavePolicy()

这将策略保存当前策略文件

RBAC 模型

RBAC只需要在模型中增加 role_definition及修改对应匹配器

[role_definition]
g = _, _
# 第一个_表示用户,第二个_表示角色
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
# g(r.sub, p.sub) 表示 请求的 sub的角色 和 策略中的sub匹配

策略此时可以写成

p, admin, data1, read
r, alice, admin

表示alice是admin角色, 可以read data1

角色层次

Casbin 的 RBAC 支持 RBAC1 的角色层次结构功能,如果alice具有role1,role1具有role2,则alice也将拥有role2并继承其权限。

多租户

需要在模型增加 domain相关定义
模型文件定义如下

[request_definition]
r = sub, dom, obj, act[policy_definition]
p = sub, dom, obj, act[role_definition]
g = _, _, _
# 第三个 _ 表示域/租户的名称[policy_effect]
e = some(where (p.eft == allow))[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act

策略文件相应改为

p, admin, tenant1, data1, read
p, admin, tenant2, data2, readg, alice, admin, tenant1
g, alice, user, tenant2

表示alice在tenant1内是admin角色, 可以read data1

管理api

casbin支持完善的RBAC 相关的API, 如新增角色、删除角色, 获取用户所有角色等 https://casbin.org/zh/docs/rbac-api

ABAC 模型

casbin也可以方便实现ABAC模型, 如下,如果申请者是obj的所有者, 可以做任意事情

[request_definition]
r = sub, obj, act[policy_definition]
p = sub, obj, act[role_definition]
g = _, _[policy_effect]
e = some(where (p.eft == allow))[matchers]
m = r.sub.Name == r.obj.Owner

这里 r.sub 和 r.obj 都可以有自己的属性,使用ABAC时, 需要在 Enforce函数使用有属性的数据类, eg

class Task:def __init__(self, name, owner):self.Name = nameself.Owner = owner
task1 = Task('t1', 'alice')class User:def __init__(self, name):self.Name = namealice = User('alice')
bob = User('bob')
assert e.enforce(alice, task1, 'delete') == True
assert e.enforce(bob, task1, 'delete') == False

Model存储

一般从文件中直接读取, 不在运行时改变

Policy存储

可以通过适配器保存策略到mysql, redis, etcd等, 例如

a, _ := gormadapter.NewAdapter("mysql", "mysql_username:mysql_password@tcp(127.0.0.1:3306)/") // Your driver and data source.e, _ := casbin.NewEnforcer("examples/rbac_model.conf", a)

然后通过适配器API对策略进行管理

多实例同步

分布式同步服务多实例部署情况下可以使用 etcd, redis等进行同步策略变更 https://casbin.org/docs/watchers, eg

w, _ := etcdwatcher.NewWatcher([]string{"http://127.0.0.1:2379"}, "keyname")// Initialize the enforcer.
e, _ := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")// Set the watcher for the enforcer.
e.SetWatcher(w)

前端使用

在 auto模型下, 前端Casbin.js库可以使用后端提供的接口, 自动同步权限相关定义,从而保持一致
https://casbin.org/docs/frontend#advanced-usage

后端返回 CasbinJsGetUserPermission接口的数据, 文档说只有golang支持CasbinJsGetUserPermission, 但实际上python也已经支持, 其他语言未调查

管理平台casdoor

可以提供可视化界面集中管理所有的模型、策略、角色、用户等
https://casdoor.org/zh/docs/permission/permission-configuration

其他

源码: https://github.com/casdoor/casdoor
可编辑demo: https://demo.casdoor.com/
获取模型文件接口:https://demo.casdoor.com/swagger/#/Model%20API/ApiController.GetModel

这篇关于casbin 权限管理库介绍 (规范实现 acl, rbac,abac)等的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/721047

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter