近期的项目中有涉及到后台管理系统权限模块的设计,考虑把一些零碎的实践记录下来,作为一部分学习过程。主流的权限设计思路主要有两种:RBAC
和 ACL
一、ACL
ACL
即 Access Control List(权限控制列表)的缩写,这种权限控制的主要思想是以权限清单的形式,获取不同用户各自的权限列表,相比于 RBAC
的权限控制,这种形式的权限管控较为直观清晰,配置使用相对简单。
二、实现
为了实现 ACL
,通常需要开发者设计这些数据表:
-
用户信息表(
users
):记录当前系统中的全部用户信息; -
权限信息表(
privilege
):记录系统中可用的全部权限信息; -
用户组信息表(
groups
):记录管理员已配置的用户组信息; -
用户 - 组关系表(
user_groups
):记录用户和用户组之间的对应关系(多对多); -
用户组 - 权限关系表(
group_privileges
):记录用户组对应的权限关系(多对多); -
用户 - 权限关系表(
user_privileges
):记录单个用户和权限的对应关系(多对多);
不难发现,大多数的 ACL
系统都是以同时给用户和用户组赋权限的方式来管控权限,使用组权限管理的好处是,当系统用户量和权限数量增多以后,使用用户组配置权限相对方便简单。
在有了这些记录数据以后,如果需要获取某个用户的权限列表,首先需要同时获取该用户的权限列表和用户组的权限列表,进而对两者的权限进行合并,通常情况下,单独针对用户配置的权限会优先保留,也就是说,用户组权限列表会“左连接”(LEFT JOIN
)到用户的权限列表中,从而获得最终的用户权限信息。