权限系统设计的一种解法
本篇文章的内容是对在设计权限系统这个过程中的思路和查阅过的资料的整理,初次整理时间是在2019年的7月份。
权限系统相关资料
因为当时没有权限系统的产品设计经验,为了能够快速地了解和学习相关知识,我在网上查阅了很多相关的资料。对自己帮助比较大的资料罗列如下:
RBAC权限模型简述
在查阅资料的过程中,发现被提及最多的权限模型为 RBAC 。RBAC 全称为 Role-Based Access Control,即基于角色的访问控制。简单来说,RBAC 权限模型中主要由三者组成,分别是用户、角色以及权限。通过指定用户为哪些角色以及指定角色用户哪些权限来达到权限控制的目的。
需求初始阶段
在这个阶段具体的功能要做成什么样其实并不清晰。比如权限系统具体要由哪几种角色?权限系统是否需要新增角色?每种角色的权限是通过什么方式来分配的?在这个阶段这些问题都还没有答案。
所以原始的产品需求如下:
面向的用户:主要提供给系统管理员使用;
开发权限系统的目的:对接现有系统,保证数据及操作的安全性;
权限系统能够给不同的用户分配权限,用户据被分配的权限进行操作。
需求的最终确定
通过分析和查阅权限系统相关资料(见上),结合现有系统的实际情况,最后明确了功能设计,最终的需求确定如下:
面向的用户:主要提供给系统管理员使用;
开发权限系统的目的:对接现有系统,保证数据及操作的安全性;
功能设计:权限系统仅由四种角色组成,分别是超级管理员 / 普通管理员 / 普通用户 / 用户子账号,在该系统中不能添加新的角色。
每种角色的权限:
•超级管理员
•普通管理员
•普通用户
•普通用户子账号
数据库表设计及具体的权限实现
默认权限
角色默认的权限通过 django-rest-framework 来规限。在登录前,系统就会判断该用户属于什么角色,属于哪种角色默认就可以访问对应的页面和资源。
被设定的权限
通过数据库表来规限。建立三张数据表,用户表、权限表以及用户权限表。用户表中除了关于用户个人信息的字段还增加了一个角色字段,权限表中包括被允许设定的权限。用户拥有哪些权限就写在了用户权限表里面。用户与权限是多对多的关系。
通过上面默认权限和数据表规限的方式,完成对用户权限的具体实现,用户总权限=所属角色默认权限+被设定的权限。
权限系统与 RBAC 的比较
上述权限系统的功能是参考 RBAC 模型设计的,但是和典型的 RBAC 模型又有较多不同。主要的不同点如下:
角色
用户和角色的关系
用户的权限控制
当然上述只是权限系统设计的一种解法,并不是唯一的方案。不同的产品其实还是根据实际情况,综合考虑上线时间、人力资源、技术水平、项目环境等因素来权衡选择哪一种设计方案。因为做产品其实也是在寻求约束条件下的最优解。
发现按池建强老师中的三点建议来排版,文章看着确实舒服了很多。