权限系统设计之ACL介绍

790 阅读4分钟

权限系统设计之ACL介绍

简介

权限系统分为两大类:功能权限数据权限

  • 功能权限:用户是否能打开某一个网页,是否能点击编辑按钮等。
  • 数据权限:用户可以使用的数据范围。

ACL:Access Control List,访问控制列表。

起初是被设计出来用于控制路由器接口的指令列表。这些列表用来告诉路由器,哪些数据包可以被接受、哪些数据包需要被拒绝。

现在ACL被设计为一种最简单的功能权限控制模型,在不同的场景下会有不同的实现。所以,本文不对某一种ACL做具体讲解,而是通过一个简单的例子来帮助大家理解ACL的核心概念。

场景举例

假设现在有一个简单的图书管理系统分为两个页面:后台管理页面前台展示页面

张三 和 李四 作为网站的创建者,对于两个页面均拥有访问权限。

而 王五 和 赵六 作为网站的使用者,只能访问 前台展示页面。

因此,我们就需要一张表,来记录使用者的访问权限,也就是访问控制列表(ACL)。

用户权限
张三后台管理页面
张三前台展示页面
李四后台管理页面
李四前台展示页面
王五前台展示页面
赵六前台展示页面

张三 访问 后台管理页面,查表,发现有这条记录,返回 允许访问

张三 访问 前台展示页面,查表,发现有这条记录,返回 允许访问

王五 访问 后台管理页面,查表,发现没有这条记录,返回 拒绝访问

赵六 访问 前台展示页面,查表,发现有这条记录,返回 允许访问

有了 访问控制列表 之后,用户对于页面的可访问权限便被控制住了。

模型

通过上面的例子,我们可以很简单地构建出相关的数据库表。

  1. 用户信息表。
  2. 权限信息表。
  3. 访问控制表。

用户表

User:

idnamedescription...
0<默认值><默认值>...
1张三网站创建者...
2李四网站创建者...
3王五网站使用者...
4赵六网站使用者...
............

权限信息表

Permission:

idnameprotocaldomainpathdesc...
0<默认值><默认值><默认值><默认值><默认值>...
1后台管理页面httpswww.book.com/admin后台管理页面...
2前台展示页面httpswww.book.com/index前台展示页面...
.....................

访问控制表

ACL:

iduser_idpermission_iduser_namepermission_name...
0<默认值><默认值><默认值><默认值>...
111张三后台管理页面...
212张三前台展示页面...
321李四后台管理页面...
422李四前台展示页面...
531王五前台展示页面...
641赵六前台展示页面...
..................

总结

在实际应用的场景中,大家可以注意以下三点:

  1. 本文介绍的是一种基于 白名单 形式的ACL例子
  2. 除了白名单的形式以外,可以在ACL表中增加一列 action 的属性,取 允许拒绝 两值,可同时使用 白名单黑名单 的功能。
  3. 根据业务场景的需要,可以在ACL表中冗余一些字段,减少查询次数,属于用空间换时间的一种方式。

优点

  1. 存储结构简单。
  2. 查询效率高,通过在 ACL 表中建立 user_id - permission_id 的联合索引,可快速查询到结果。

缺点

  1. ACL 数据量级较大,表中的数据总量略小于 用户数 乘以 权限数 的积。

  2. 授权麻烦,

    1. 每新增一个跟 张三 拥有同等权限的用户,就需要向 ACL 中写入2条数据,在权限点为 N 的情况下,需要写入 N 条数据。
    2. 每新增一个所有人都有权限的页面,就需要想 ACL 中写入4条数据,在用户数为 N 的情况下,需要写入 N 条数据。

这个缺点会在下一期将要介绍的 RBAC 模型中解决。

题外话

工作快一年了,前半年在学生到职场人的转化当中忙的焦头烂额的,后半年逐渐适应工作节奏,现在已经到了游刃有余的地步了。在这一年的过程中,多多少少学习到了一些有用的知识,后面我将逐步给大家分享出来,主要包括编程语言相关知识,后端常用的数据模型知识,以及关于权限系统的业务知识,毕竟这一年中大部分的时间都在建设权限系统。感谢大家的支持。