在常用的后台管理系统中,通常都会有权限系统设计,以用于给对应人员分配不同权限,控制其对后管系统中的某些菜单、按钮以及列表数据的可见性。
本文将用 waynboot-mall 项目举例,给大家介绍常见后管系统的权限控制该如何设计。
图片
waynboot-mall 项目地址:https://github.com/wayn111/waynboot-mall
权限模型
图片
要理解权限控制,我们需要先了解什么是权限模型。
权限模型是指用于描述用户、角色和权限之间关系的一种抽象模型。不同的权限模型有不同的优缺点,适用于不同的场景和需求。在本项目中,我们采用了 RBAC(Role-Based Access Control)模型,即基于角色的访问控制模型。
RBAC 模型的基本思想是将用户和权限分离,通过角色作为中间层来连接用户和权限。一个角色可以关联多个权限,一个用户可以拥有多个角色。这样可以实现灵活的权限配置和管理,避免直接给用户分配权限带来的复杂性和冗余性。
RBAC 模型有多个扩展版本,如 RBAC0、RBAC1、RBAC2 等。在本项目中,我们使用了 RBAC0 模型,即最基本的 RBAC 模型。RBAC0 模型包含三个要素:用户(User)、角色(Role)和权限(Permission)。用户是指使用系统的主体,角色是指一组相关的权限的集合,权限是指对系统资源的访问或操作能力。
在 waynboto-mall 项目中,RBAC0 中的权限对应的就是菜单。菜单权限包含菜单页面对用户是否可见、页面按钮对用户是否可见、页面列表数据根据用户进行过滤等。
权限要素
图片
在 RBAC0 模型中,我们需要对用户、角色和权限进行定义和梳理。具体来说,我们需要确定以下几个方面:
用户的来源和属性:用户是从哪里获取的?用户有哪些属性?如用户名、密码、昵称、手机号、邮箱等。
角色的命名和分类:角色是如何命名的?角色有哪些分类?如按照部门、职位、功能等进行划分。
权限的类型和范围:权限有哪些类型?权限涉及哪些资源?如页面权限、操作权限、数据权限等。
用户、角色和权限之间的关联方式:用户如何与角色关联?角色如何与权限关联?如一对一、一对多、多对多等。
在 waynboto-mall 项目中,我做了以下的定义和梳理:
用户设计
用户来源于系统内部注册或外部导入,用户有用户名、密码、姓名、手机号、邮箱等属性。表结构如下,
CREATE TABLE `sys_user` (
`user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`dept_id` bigint DEFAULT NULL COMMENT '部门ID',
`user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户账号',
`nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户昵称',
`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '用户邮箱',
`phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '手机号码',
`sex` tinyint DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
`avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '头像地址',
`password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '密码',
`user_status` tinyint DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '备注',
`del_flag` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
PRIMARY KEY (`user_id`) USING BTREE,
UNIQUE KEY `user_name_uqi` (`user_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='用户信息表';
角色设计
角色按照功能模块进行命名,如商品管理、订单管理、营销管理等。角色可以分为普通角色和超级管理员角色,普通角色可以拥有部分或全部功能模块的权限,超级管理员角色可以拥有所有功能模块的权限,并且可以管理其他用户和角色。表结构如下
CREATE TABLE `sys_role` (
`role_id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色ID',
`role_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色名称',
`role_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色权限字符串',
`sort` int NOT NULL COMMENT '显示顺序',
`role_status` tinyint NOT NULL COMMENT '角色状态(0正常 1停用)',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '备注',
`del_flag` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
PRIMARY KEY (`role_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='角色信息表';
超级管理员也就是 rule_key 为 admin 角色,赋予了 admin 角色用户拥有系统的绝对控制能力。
权限(菜单)设计
权限分为页面权限、操作权限和数据权限。页面权限控制用户可以看到哪些页面或菜单,操作权限控制用户可以在页面上执行哪些操作或按钮,数据权限控制用户可以查看或修改哪些数据或范围。表结构如下,
CREATE TABLE `sys_menu` (
`menu_id` bigint NOT NULL AUTO_INCREMENT COMMENT '菜单ID',
`menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '菜单名称',
`parent_id` bigint DEFAULT '0' COMMENT '父菜单ID',
`sort` int DEFAULT '0' COMMENT '显示顺序',
`path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '路由地址',
`component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '组件路径',
`is_frame` tinyint DEFAULT '1' COMMENT '是否为外链(0是 1否)',
`menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)',
`menu_status` tinyint DEFAULT NULL COMMENT '菜单状态(0启用 1禁用)',
`visible` tinyint DEFAULT '0' COMMENT '显示状态(0显示 1隐藏)',
`perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '权限标识',
`icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '#' COMMENT '菜单图标',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '' COMMENT '备注',
PRIMARY KEY (`menu_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2055 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='菜单权限表';
用户角色关联设计
用户与角色之间是多对多的关联方式,即一个用户可以拥有多个角色,一个角色可以分配给多个用户。角色与权限之间也是多对多的关联方式,即一个角色可以拥有多个权限,一个权限可以分配给多个角色。用户角色关联表、角色菜单关联表结构如下,
CREATE TABLE `sys_user_role` (
`user_id` bigint NOT NULL COMMENT '用户ID',
`role_id` bigint NOT NULL COMMENT '角色ID',
PRIMARY KEY (`user_id`,`role_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='用户和角色关联表';
CREATE TABLE `sys_role_menu` (
`role_id` bigint NOT NULL COMMENT '角色ID',
`menu_id` bigint NOT NULL COMMENT '菜单ID',
PRIMARY KEY (`role_id`,`menu_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='角色和菜单关联表';
后管权限设计 ER 图
图片
waynboot-mall 项目的后台权限系统设计相关 er 图如下,
权限分配
当我们理解清楚后权限模型后,就该进行具体的权限分配了。在进行权限分配时,我们需要遵循以下几个原则:
权限分配要合理:不同的角色应该拥有与其职责相符合的权限,不应该给予过多或过少的权限。
权限分配要灵活:不同的场景和需求可能需要调整权限配置,应该提供方便和快捷的方式来进行权限变更。
权限分配要安全:权限变更应该有明确的审批和记录流程,避免因为权限错误或滥用导致系统风险(也就是权限相关的操作需要有日志记录)。
在 waynboto-mall 项目中,我们采用了以下几种方式来进行权限分配:
用户角色分配
通过给用户分配角色来实现权限分配:这是最常见和最基本的方式,通过勾选用户拥有的角色来控制用户拥有的权限。
角色权限分配
通过给角色分配权限来实现权限分配:这是最灵活和最细粒度的方式,通过勾选角色拥有的权限来控制角色拥有的权限。
超管角色定义
通过设置超级管理员角色(role_key 为 admin)来实现全局权限管理:这是最简单和最高效的方式,通过设置一个超级管理员来控制所有功能模块和数据范围的访问和操作。
总结一下
本文给大家讲解了常见后管系统的权限控制系统该如何设计,在常用的 RBAC0 权限模型下,权限要素包含用户、角色、权限(菜单)三要素,只要大家能理解用户、角色、权限(菜单)三要素的设计理念以及表结构后,相信就能轻松掌握后管权限控制系统的设计精髓。