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

一、ACL

ACL 即 Access Control List(权限控制列表)的缩写,这种权限控制的主要思想是以权限清单的形式,获取不同用户各自的权限列表,相比于 RBAC 的权限控制,这种形式的权限管控较为直观清晰,配置使用相对简单。

二、实现

为了实现 ACL,通常需要开发者设计这些数据表:

  • 用户信息表(users):记录当前系统中的全部用户信息;

  • 权限信息表(privilege):记录系统中可用的全部权限信息;

  • 用户组信息表(groups):记录管理员已配置的用户组信息;

  • 用户 - 组关系表(user_groups):记录用户和用户组之间的对应关系(多对多);

  • 用户组 - 权限关系表(group_privileges):记录用户组对应的权限关系(多对多);

  • 用户 - 权限关系表(user_privileges):记录单个用户和权限的对应关系(多对多);

不难发现,大多数的 ACL 系统都是以同时给用户和用户组赋权限的方式来管控权限,使用组权限管理的好处是,当系统用户量和权限数量增多以后,使用用户组配置权限相对方便简单。

在有了这些记录数据以后,如果需要获取某个用户的权限列表,首先需要同时获取该用户的权限列表和用户组的权限列表,进而对两者的权限进行合并,通常情况下,单独针对用户配置的权限会优先保留,也就是说,用户组权限列表会“左连接”(LEFT JOIN)到用户的权限列表中,从而获得最终的用户权限信息。