权限系统设计之ACL介绍
简介
权限系统分为两大类:功能权限和数据权限。
- 功能权限:用户是否能打开某一个网页,是否能点击编辑按钮等。
- 数据权限:用户可以使用的数据范围。
ACL:Access Control List,访问控制列表。
起初是被设计出来用于控制路由器接口的指令列表。这些列表用来告诉路由器,哪些数据包可以被接受、哪些数据包需要被拒绝。
现在ACL被设计为一种最简单的功能权限控制模型,在不同的场景下会有不同的实现。所以,本文不对某一种ACL做具体讲解,而是通过一个简单的例子来帮助大家理解ACL的核心概念。
场景举例
假设现在有一个简单的图书管理系统分为两个页面:后台管理页面 和 前台展示页面。
张三 和 李四 作为网站的创建者,对于两个页面均拥有访问权限。
而 王五 和 赵六 作为网站的使用者,只能访问 前台展示页面。
因此,我们就需要一张表,来记录使用者的访问权限,也就是访问控制列表(ACL)。
用户 | 权限 |
---|---|
张三 | 后台管理页面 |
张三 | 前台展示页面 |
李四 | 后台管理页面 |
李四 | 前台展示页面 |
王五 | 前台展示页面 |
赵六 | 前台展示页面 |
张三 访问 后台管理页面,查表,发现有这条记录,返回 允许访问。
张三 访问 前台展示页面,查表,发现有这条记录,返回 允许访问。
王五 访问 后台管理页面,查表,发现没有这条记录,返回 拒绝访问。
赵六 访问 前台展示页面,查表,发现有这条记录,返回 允许访问。
有了 访问控制列表 之后,用户对于页面的可访问权限便被控制住了。
模型
通过上面的例子,我们可以很简单地构建出相关的数据库表。
- 用户信息表。
- 权限信息表。
- 访问控制表。
用户表
User:
id | name | description | ... |
---|---|---|---|
0 | <默认值> | <默认值> | ... |
1 | 张三 | 网站创建者 | ... |
2 | 李四 | 网站创建者 | ... |
3 | 王五 | 网站使用者 | ... |
4 | 赵六 | 网站使用者 | ... |
... | ... | ... | ... |
权限信息表
Permission:
id | name | protocal | domain | path | desc | ... |
---|---|---|---|---|---|---|
0 | <默认值> | <默认值> | <默认值> | <默认值> | <默认值> | ... |
1 | 后台管理页面 | https | www.book.com | /admin | 后台管理页面 | ... |
2 | 前台展示页面 | https | www.book.com | /index | 前台展示页面 | ... |
... | ... | ... | ... | ... | ... | ... |
访问控制表
ACL:
id | user_id | permission_id | ... | ||
---|---|---|---|---|---|
0 | <默认值> | <默认值> | ... | ||
1 | 1 | 1 | ... | ||
2 | 1 | 2 | ... | ||
3 | 2 | 1 | ... | ||
4 | 2 | 2 | ... | ||
5 | 3 | 1 | ... | ||
6 | 4 | 1 | ... | ||
... | ... | ... | ... | ... | ... |
总结
在实际应用的场景中,大家可以注意以下三点:
- 本文介绍的是一种基于 白名单 形式的ACL例子
- 除了白名单的形式以外,可以在ACL表中增加一列
action
的属性,取 允许 和 拒绝 两值,可同时使用 白名单 和 黑名单 的功能。 - 根据业务场景的需要,可以在
ACL
表中冗余一些字段,减少查询次数,属于用空间换时间的一种方式。
优点
- 存储结构简单。
- 查询效率高,通过在
ACL
表中建立user_id - permission_id
的联合索引,可快速查询到结果。
缺点
-
ACL
数据量级较大,表中的数据总量略小于 用户数 乘以 权限数 的积。 -
授权麻烦,
- 每新增一个跟 张三 拥有同等权限的用户,就需要向
ACL
中写入2条数据,在权限点为 N 的情况下,需要写入 N 条数据。 - 每新增一个所有人都有权限的页面,就需要想
ACL
中写入4条数据,在用户数为 N 的情况下,需要写入 N 条数据。
- 每新增一个跟 张三 拥有同等权限的用户,就需要向
这个缺点会在下一期将要介绍的 RBAC
模型中解决。
题外话
工作快一年了,前半年在学生到职场人的转化当中忙的焦头烂额的,后半年逐渐适应工作节奏,现在已经到了游刃有余的地步了。在这一年的过程中,多多少少学习到了一些有用的知识,后面我将逐步给大家分享出来,主要包括编程语言相关知识,后端常用的数据模型知识,以及关于权限系统的业务知识,毕竟这一年中大部分的时间都在建设权限系统。感谢大家的支持。