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

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja