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++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景