什么是Casbin-rs
Casbin是罗杨博士主导开发的基于 Go 语言的权限控制库。它支持 ACL, RBAC, ABAC 等常用的访问控制模型。
Casbin-rs则是 Rust 语言下的移植, 相比 Go 语言版本有更高的速度和内存安全保障。
Casbin 做了什么
- Casbin 的配置文件由两部分组成, 一个是 Configuration 文件(可以理解为模型配置文件), 配置了模型( Model )选用,分组( Group )配置,定义请求( Request )和策略( Policy )结构,再有就是匹配器( Matcher )的配置,这些在后文由叙述。另外一个就是策略( Policy )的盛放容器, 这个可以是 csv 文件,也可以是数据库( MySQL/PostgreSQl )。容器中的 Policies 都衍生于 Model 的配置
- 支持 RBAC 中的多层角色继承,不止主体可以有角色,资源也可以具有角色
- 支持超级用户,如 root 或 Administrator,超级用户可以不受授权策略的约束访问任意资源
- 支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /book/1 可以映射到 /book/:id
Casbin 不做什么
- 身份认证 authentication(即验证用户的用户名、密码),casbin 只负责访问控制。应该有其他专门的组件负责身份认证,然后由 casbin 进行访问控制,二者是相互配合的关系。
- 管理用户列表或角色列表。Casbin 认为由项目自身来管理用户、角色列表更为合适,用户通常有他们的密码,但是 Casbin 的设计思想并不是把 它作为一个存储密码的容器。而是存储 RBAC 方案中用户和角色之间的映射关系。
一个例子
模型配置
// model.conf
# Request definition
[request_definition]
r = sub, obj, act
# Policy definition
[policy_definition]
p = sub, obj, act
# Policy effect
[policy_effect]
e = some(where (p.eft == allow))
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
这是一个模型定义文件, 其中sub
代表访问资源的用户, obj
表示要访问的资源, act
表示对资源执行的操作。如果在 Web 的情形中,可以理解为,sub 对应用户名,obj 对应访问的 URL Path,act 代表 HTTP 动作(GET/POST/PUT).
在这里,Request Definition 告诉我们请求是什么构成,一共三个。Policy Defination 有什么构成,和前面的同理。Policy Effect 告诉我们什么时候规则是有效的,而 Matcher 告诉我们当请求和策略满足一定关系才可以返回真(允许操作)。如上,意思就很明白。
如果我们要加入一个超级管理员,它可以执行任何操作,可以这样写:
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act || r.sub == "root"
策略配置
p, alice, data1, read
p, bob, data2, write
上述的配合上文的模型配置表达的意思就是,alice 可以读 data1,bob 可以写 data2
Casbin Rust 生态
主仓库:
Casbin-RS: 目前支持所有 Casbin Go 版本支持的特性,正在活跃开发中
目前 Casbin Rust 正稳步发展中,目前支持的组件有:
- Casbin Diesel Adaper: 使用 Rust 目前最火的 ORM 类库开发的适配器,支持 MySQL/PostgreSQL/SQLite
- Casbin Actix-web Middleware: Rust 最由名气的 Web 框架当属 Actix-web,性能霸榜。Casbin 支持 Actix 中间件,自动为请求进行权限管理
- Casbin Actix-web Actor: Actix 框架下对 Casbin 进行二次封装,方便在 Actix-web 中使用,封装了常用函数
- Casbin Sqlx Adapter: 支持完全异步的数据库中间件,性能更好,基于 Sqlx 。支持 MySQL/PostgreSQL
基于 Actix-web 开发,使用 Casbin 中间件鉴权, 使用 JWT 用户授权的例子:
此外 Casbin 拥有强大的文档支持和社区依托:
- Casbin 官网 Casbin 文档
- Casbin 论坛
- Casbin 同时支持除了 Go,Rust 以外六种语言:Node.js, PHP, Python, C#(.NET), C++, Java
最后希望各位看官走过路过,别忘了给一个 Star 支持一下我们的开发
Ext Link: https://github.com/casbin/casbin-rs
评论区
写评论下一个,研究项目。