马晓峰的个人主页

如果自己就是潮水的一部分 | 怎么能看见潮流的方向呢?

2021/07/12

说一说用户权限设计


从我们项目角度说一说用户权限设计

概述

之前接触的项目大多都是定制化项目,所有的权限都是该项目共用的,所以一套用户权限设计就足以支撑整个项目使用。然而还有一些项目中其实是存个多个组织体的,多个组织体之间共用一套权限体系,而不同的组织体使用的权限也有可能是不同的,这就使得原有的权限设计无法满足项目需要,达不到产品化要求,需要对权限进行抽取。

通用的权限设计

通用的权限设计一般分为用户、角色、权限, 用户与角色为多对多关系,角色与权限为多对多关系,具体关系见图1.1。

1.png

1.1 用户、角色、权限关系图

可以看出这里面权限池的权限都是共用的,在为角色分配权限时,可以取权限池中的任意一个权限。假如这是一个产品的话,那么由产品分一个项目出来时,这个项目天然就拥有所有权限,当该项目集成进一个组织体时,不管该组织体是否需要,都会拥有项目所有权限。而且权限都是单独的,也不好进行维护。

多租户式的权限设计

多租户可以理解为一个项目中存在多个不同的组织体,不同组织体之间的数据是完全隔离的,且每个组织体之间的数据权限需要满足按需分配。

当项目有且仅有一个租户时,是可以不用进行管理的,因为所有的数据及权限都是该租户所有,一旦有多个租户的存在时,租户就也需要进行管理,为每个租户分配其所需要的资源。

向上抽取一层租户权限是对多个租户进行管理最方便及快捷的方式,每个租户所需要的资源统一由系统管理员统一进行分配,并为每租户生成租户管理员用户,之后每个租户下的管理员进行权限分配时,就会只能使用系统管理员为其分配的权限进行分配。具体用户体系关系见图1.2。

2.png

1.2 用户体系关系图

可以看出系统管理员拥有最高权限,通常是用来创建租户及为租户分配资源使用。创建租户时,在为租户分配资源的同时需要为租户生成租户管理员账号,该账号拥有为该租户分配的所有资源权限,再由租户管理员进行自己租户下人员、角色的创建及资源分配。

由于权限池的权限都是单独的,在权限过多的项目中,系统管理员在为每个租户分配权限时必然会花费更长的时间进行分配,且每个租户需要的权限通常是一组一组的,租户所需要的也是一个个模块整体所有的权限。

基于以上考虑,对权限进行服务化管理是比较灵活的方式,多个权限统一为一个服务权限(按模块划分比较理想),这样就可以直接为每个租户分配其需要的不同服务即可。

多租户权限关系见图1.3

3.png

1.3 多租户权限关系

在上面的多租户权限关系中,每个租户拥有各自的权限,且由系统管理员分配,这个的权限分配规则可以是租户使用者申请(购买),也可以是默认服务(免费使用),灵活分配。最后再由租户管理员进行租户内的角色及用户权限分配。

通用权限设计与多租户权限设计的不同

从权限项角度看,多租户权限设计是将通用权限设计里面的每个小权限项进行服务化管理。

从权限结构角度看,多租户权限的设计是从通用权限设计向上抽取出了一层权限,即为租户先分配对应的服务权限。

以上就是多租户权限设计,其中也面临着一些问题,比如只想为某个租户分配单个服务下部分权限等,还有待优化。


参考

tags: