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

相关推荐
忍界英雄几秒前
在基于go开发的web应用中加入Nginx反向代理
nginx·golang
0x派大星6 小时前
Golang 并发编程入门:Goroutine 简介与基础用法
开发语言·后端·golang·go·goroutine
福大大架构师每日一题6 小时前
27.9 调用go-ansible执行playbook拷贝json文件重载采集器
golang·json·ansible·prometheus
codists10 小时前
《使用Gin框架构建分布式应用》阅读笔记:p251-p271
golang·gin·编程人
凡人的AI工具箱20 小时前
15分钟学 Go 第 21 天:标准库使用
开发语言·后端·算法·golang·1024程序员节
半桶水专家20 小时前
go语言中函数的用法
开发语言·后端·golang
幺零九零零20 小时前
[golang] ent使用
数据库·后端·golang
执念斩长河20 小时前
GO基础(string相关)
linux·服务器·golang
确实可以20 小时前
go-zero 的使用
后端·微服务·golang·go-zero
程序员阿法1 天前
Go语言基础教程:数据结构Map
开发语言·golang·go