Casbin是什么?

简介

Casbin是一个开源的访问控制框架,它支持多种访问控制模型,如ACL(访问控制列表)、RBAC(基于角色的访问控制)、ABAC(基于属性的访问控制)等。Casbin的设计目标是提供一个灵活、高效、易于使用的权限管理解决方案,适用于各种规模的项目。

主要特点

  • 多种访问控制模型

    • Casbin支持多种访问控制模型,包括ACL、RBAC、ABAC等,这些模型可以单独使用,也可以组合使用以满足复杂的权限管理需求。
  • 策略持久化

    • Casbin的策略可以存储在多种地方,包括内存、文件、数据库等。目前支持多种数据库,如MySQL、Postgres、Oracle、MongoDB、Redis、Cassandra、AWS S3等。
  • 跨语言支持

    • Casbin已经用多种语言实现,包括Go、Java、Node.js、PHP、Python、C#、Delphi、Rust、Lua等,所有实现共享相同的API和行为,学习一次即可在不同语言项目中使用。
  • 灵活的策略存储方式

    • 除了内存和文件,Casbin的策略可以存储在多种数据库中,这为大型多租户环境提供了有效的策略执行能力。
  • 角色管理器

    • Casbin提供了角色管理器来管理RBAC中的角色继承关系,可以与外部系统如LDAP、Okta、Auth0、Azure AD等集成。
  • 身份认证与访问控制的分离

    • Casbin只负责访问控制,而身份认证(即验证用户的用户名和密码)则应由其他专门的组件负责。这种设计使得Casbin可以与其他身份验证系统无缝集成。
  • 简单的使用方式

    • 创建一个Casbin执行器(Enforcer)需要提供一个模型(Model)和一个适配器(Adapter)。模型定义了访问控制的结构,而适配器则负责策略的存储和读取。Casbin提供了多种适配器,包括文件适配器和数据库适配器,以适应不同的存储需求。
  • 管理API

    • Casbin提供了管理API,允许在运行时进行权限管理,例如获取分配给用户的角色列表等。
  • 社区支持

    • Casbin有一个活跃的社区,提供了丰富的文档和示例,帮助开发者快速上手和解决问题。

工作原理

Casbin的工作原理基于PERM模型,即Policy(策略)、Effect(效果)、Request(请求)、Matcher(匹配器)。通过配置文件定义这些组件,可以轻松地切换或升级项目的授权机制。

策略(Policy):

策略定义了具体的权限规则,它通常存储在策略文件中,如.csv或.txt文件。策略文件包含了哪些用户或角色可以执行哪些操作的详细信息。

效果(Effect):

效果定义了策略的执行结果,它可以被理解为一种模型,在这种模型中,对匹配结果再次作出逻辑组合判断。通常是"允许"或"拒绝"。在Casbin中,如果策略匹配并且效果为"允许",则请求被授权。

请求(Request):

请求代表了对资源的访问请求,它通常包含主体(如用户)、资源和操作。Casbin在执行访问控制决策时,会将请求与策略进行匹配。

定义请求参数,基本请求是一个元组对象,至少需要主题(访问实体)、对象(访问资源) 和动作(访问方式);例如,一个请求可能长这样: r={sub,obj,act},它实际上定义了我们应该提供访问控制匹配功能的参数名称和顺序。

匹配器(Matchers):

匹配器是Casbin中用于匹配请求和策略的逻辑。它定义了如何比较请求中的元素与策略中的元素,以确定是否匹配

模型(Model)

Casbin的模型定义了访问控制的结构,包括请求定义(request_definition)、策略定义(policy_definition)、角色定义(role_definition)、策略效果(policy_effect)和匹配器(matchers)。模型文件通常以.conf或.model为后缀,它使用Casbin的模型编辑器进行编辑和维护。

适配器(Adapter):

Casbin使用适配器来加载和保存策略,适配器可以是文件系统、数据库或其他存储系统。适配器允许Casbin动态地添加、修改或删除策略,而不需要重启应用程序。

执行器(Enforcer):

执行器是Casbin中用于执行访问控制决策的组件。它根据模型和策略文件来验证传入的请求是否被授权。

Watcher:

Watcher是Casbin中用于监听策略变化的组件。当策略存储在数据库或其他外部系统中时,Watcher可以监听这些变化,并将最新的策略更新到执行器中。

角色管理器(Role Manager):

在RBAC模型中,角色管理器用于管理角色之间的继承关系。它允许定义角色的层次结构,并管理用户和角色之间的关系。

如何使用?

导入依赖

要在项目中使用casbin,首先需要加载依赖:

go 复制代码
go get github.com/casbin/casbin/v2

配置文件

Casbin使用配置文件来设置访问控制模式,它有两个配置文件,model.conf和policy.csv。 其中,model.conf存储了访问模型,policy.csv存储了特定的用户权限配置。基本上,我们只需要一个主要结构:enforcer。要新建一个Casbin执行器,你必须提供一个Model和一个Adapter。

go 复制代码
import "github.com/casbin/casbin/v2"
e, err := casbin.NewEnforcer("path/to/model.conf", "path/to/policy.csv")

这行代码用于初始化一个Casbin的执行器(Enforcer);

🧠由代码可以看出策略是从本地文件"path/to/policy.csv"中加载的。这意味着策略是静态的,任何对策略的更改都需要修改CSV文件并重新启动应用程序。

🧠而path/to/model.conf指向一个模型文件,通常是 .conf 文件,它定义了访问控制模型的结构。这个模型文件描述了如何表达和匹配访问控制策略,包括请求定义(request_definition)、策略定义(policy_definition)、角色定义(role_definition,如果有的话)、策略效果(policy_effect)和匹配器(matchers)。

参考文档:casbin

相关推荐
ThisIsClark1 小时前
【玩转正则表达式】Python、Go、Java正则表达式解释器的差异解析(附示例)
java·python·golang·正则表达式
叶雅茗6 小时前
PHP语言的区块链扩展性
开发语言·后端·golang
ydl112811 小时前
GO语言的GC(垃圾回收)原理
golang
丶重明12 小时前
【Go每日一练】猜数字游戏
游戏·golang
谭知曦16 小时前
Scheme语言的压力测试
开发语言·后端·golang
阮清漪16 小时前
Bash语言的智能家居
开发语言·后端·golang
尤宸翎17 小时前
Bash语言的语法
开发语言·后端·golang
还没入门的大菜狗20 小时前
【go】Go 语言中 errors.Is 和 errors.As 的区别
golang
平谷一勺20 小时前
golang中的结构体
开发语言·后端·golang·序列化·结构体·结构体嵌套·匿名结构体嵌套
Pyroyster21 小时前
【Go语言圣经2.3】
开发语言·后端·golang