近期的项目中有涉及到后台管理系统权限模块的设计,考虑把一些零碎的实践记录下来,作为一部分学习过程。主流的权限设计思路主要有两种:RBACACL.

一、RBAC

RBAC 即 Role Basic Access Control (基于角色的权限控制),主要的思想是通过自定义的不同角色来控制权限,不同的用户可以拥有不同的角色,单个用户可以同时拥有多个角色。当系统需要获取某个用户的权限时,需要先确定该用户所拥有的所有角色,在依据角色包含的权限来确定该用户最终拥有的权限清单。

二、实现

RBAC 的实现通常需要依赖下面这些数据表:

  • 用户信息表(users):记录系统中的所有用户信息,该表的记录实体是“用户”;

  • 角色信息表(roles):用来记录所有可用的角色信息,记录实体是“角色”;

  • 权限信息表(privileges):记录所有可用的权限信息,实体是“权限”;

  • 用户 - 角色关系表(user_roles):记录系统中用户和角色实体的对应关系(通常是“多对多”关系,即一个用户可以拥有吧多种角色,某个角色也可以同时被多个用户持有);

  • 角色 - 权限关系表(role_privileges):记录系统中角色和权限实体之间的对应关系(通常也是“多对多”的关系)

三、权限管理

对于一次正确的权限获取过程,数据流通常是这样的:

    users ---> user_roles ---> role_privileges ---> privileges

例如对于某个用户“张三”,如果需要获取他的所有权限,应当先通过 user 获取到该用户 user_id=1, 然后使用这个 user_iduser_roles 表中查到其对应的全部角色主键是:1,2,3,获取到角色列表后,再通过 role_privileges 表查到这些角色对应的所有权限信息(主键 id),最后通过 privileges 表就能查到最终的权限列表信息了。

四、改进

通常情况下,对于一个大型项目来说,系统中可用的权限会非常多,尤其是对于需要细粒度管控权限的场景,如果系统中的权限列表过长,会给系统管理员进行权限分配时候带来很大的不便,为此,在项目中可以对权限进行分组管理,即在“权限”和“角色”之间构建一个“权限组”的分层。

通常,一个“权限组”可以使一系列紧密关联的权限的集合,通常是系统中的某个具体模块,例如,可以吧对“用户信息的增删改查操作”归为一个权限组,如果某个角色拥有这一权限组,即同时拥有了该权限组下的全部权限,这样管理员再管控权限时候,可以权限组为单位进行权限的分配,从而避免了大量重复的权限分配过程。