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

相关文章

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S