简介
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