多租户通用权限设计(基于 casbin)
所谓权限控制, 概念并不复杂, 就是确认某个操作是否能做, 本质上仅仅就是个bool判断.
权限几乎是每个系统必不可少的功能, 和具体业务结合之后, 在系统中往往表现的非常复杂和难于控制, 很大部分原因是把权限和具体业务结合的太过紧密, 把业务的复杂度也加入到权限控制中来了.
一直以来, 都有个想法, 想做一套简单好用的通用权限系统, 和任何业务都没有关系, 仅仅就是权限本身的功能.
对此, 做过很多尝试, 由于设计能力有限, 最后都不了了之, 没能坚持做出来.
直到看到了 casbin
, 这个库正是一直以来想要做的, 功能强大(几乎涵盖了所有的权限场景), 使用简单, 将权限彻底的独立了出来.
所以, 基于此库, 做了一套简单的权限系统API, 以及一个简单的前端.
1. 对 casbin 的理解
我对 casbin
的理解是这样的, 我觉得它之所有如此简洁且功能强大, 是因为它将权限分为了2块:
- 对权限策略的管理
- 对权限的判断
1.1 权限策略
在我看来, casbin
的核心策略主要有2种:
- 组: 对人员的管理, 一条组策略包括
用户
,角色
,租户
- 权限: 权限控制的依据, 一条权限策略包括
用户/角色
,租户
,资源
,操作
通过对权限策略
的定义, 可以控制系统中任何资源的访问.
组策略
的定义可以简化权限策略
的定义, 否则每个用户
都要定义大量权限策略
1.2 权限判断
权限判断看似复杂, 其实就是确认能或不能的问题, 只要策略描述清楚的了权限, 这里的判断也很简单.
所以 casbin
的权限判断很简单, 一般只用配置文件定义下就可以了.
说白了, 它就是定义依据组策略
和权限策略
, 在什么情况下是PASS
, 什么情况是NG
2. API介绍
我尝试基于casbin
所做的权限系统, 并不是要做个大而全的, 而是针对自己的项目, 做了个基于RBAC的多租户权限系统.
API主要分3类:
- 管理: 用于创建
组策略
和权限策略
- 预览: 基于
用户
, 或者基于角色
, 或者基于租户
来表达权限关系 - 权限控制: 判断
用户
或者角色
是否有权限
后端是基于 golang 来封装的: GIT地址(dev分支)
API的相关代码在: src/labrador/controllers/tenant_rbac_api
3. 前端介绍
前端是简单的react+redux
应用, 主要使用了 管理
和预览
的API: GIT地址(dev分支)
用了 G6 这个库来表达权限之间的关系.
4. 总结
虽然只是尝试了casbin
的一部分功能, 但是依然感受了它的简洁和强大.
它对权限的独立做了非常好的定义, 而且以库的形式提供, 也方便集成到各种业务系统中, 是个非常值得采用的通用权限库.