Version: Next
RBAC权限管理模型
Role-Based Access Control
基于角色的权限管理
- 用户:系统接口及访问的操作者
- 权限:能够访问某接口或者做某操作的授权资格
- 角色:具有一类相同操作权限的用户的总称
一个用户拥有一个角色
- 一个用户有一个角色
- 一个角色有多个权限
- 一个权限可以属于多种角色
数据库结构
一个用户拥有多个角色
- 一个用户有一个或多个角色
- 一个角色包含多个用户
- 一个角色有多种权限
- 一个权限属于多个角色
- sys_user是用户信息表,用于存储用户的基本信息,如:用户名、密码
- sys_role是角色信息表,用于存储系统内所有的角色
- sys_menu是系统的菜单信息表,用于存储系统内所有的菜单。用id与父id的字段关系维护一个菜单树形结构。
- sys_user_role是用户角色多对多关系表,一条userid与roleid的关系记录表示该用户具有该角色,该角色包含该用户。
- sys_role_menu是角色菜单(权限)关系表,一条roleid与menuid的关系记录表示该角色由某菜单权限,该菜单权限可以被某角色访问。
页面访问权限与操作权限
- 页面访问权限: 所有系统都是由一个个的页面组成,页面再组成模块,用户是否能看到这个页面的菜单、是否能进入这个页面就称为页面访问权限。
- 操作权限: 用户在操作系统中的任何动作、交互都需要有操作权限,如增删改查等。比如:某个按钮,某个超链接用户是否可以点击,是否应该看见的权限。
Ruoyi的权限分表
组织部门表
为了能构建一个树形结构
CREATE TABLE `sys_org` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`org_pid` INT(11) NOT NULL COMMENT '上级组织编码',
`org_pids` VARCHAR(64) NOT NULL COMMENT '所有的父节点id',
`is_leaf` TINYINT(4) NOT NULL COMMENT '0:不是叶子节点,1:是叶子节点',
`org_name` VARCHAR(32) NOT NULL COMMENT '组织名',
`address` VARCHAR(64) NULL DEFAULT NULL COMMENT '地址',
`phone` VARCHAR(13) NULL DEFAULT NULL COMMENT '电话',
`email` VARCHAR(32) NULL DEFAULT NULL COMMENT '邮件',
`sort` TINYINT(4) NULL DEFAULT NULL COMMENT '排序',
`level` TINYINT(4) NOT NULL COMMENT '组织层级',
`status` TINYINT(4) NOT NULL COMMENT '0:启用,1:禁用',
PRIMARY KEY (`id`)
)
COMMENT='系统组织结构表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
菜单权限表
同样构建一个树形结构
CREATE TABLE `sys_menu` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`menu_pid` INT(11) NOT NULL COMMENT '父菜单ID',
`menu_pids` VARCHAR(64) NOT NULL COMMENT '当前菜单所有父菜单',
`is_leaf` TINYINT(4) NOT NULL COMMENT '0:不是叶子节点,1:是叶子节点',
`menu_name` VARCHAR(16) NOT NULL COMMENT '菜单名称',
`url` VARCHAR(64) NULL DEFAULT NULL COMMENT '跳转URL',
`icon` VARCHAR(45) NULL DEFAULT NULL,
`icon_color` VARCHAR(16) NULL DEFAULT NULL,
`sort` TINYINT(4) NULL DEFAULT NULL COMMENT '排序',
`level` TINYINT(4) NOT NULL COMMENT '菜单层级',
`status` TINYINT(4) NOT NULL COMMENT '0:启用,1:禁用',
PRIMARY KEY (`id`)
)
COMMENT='系统菜单表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
角色表 | 角色菜单关联表
CREATE TABLE `sys_role` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`role_name` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '角色名称(汉字)',
`role_desc` VARCHAR(128) NOT NULL DEFAULT '0' COMMENT '角色描述',
`role_code` VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '角色的英文code.如:ADMIN',
`sort` INT(11) NOT NULL DEFAULT '0' COMMENT '角色顺序',
`status` INT(11) NULL DEFAULT NULL COMMENT '0表示可用',
`create_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '角色的创建日期',
PRIMARY KEY (`id`)
)
COMMENT='系统角色表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
CREATE TABLE `sys_role_menu` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`role_id` INT(11) NOT NULL DEFAULT '0' COMMENT '角色id',
`menu_id` INT(11) NOT NULL DEFAULT '0' COMMENT '权限id',
PRIMARY KEY (`id`)
)
COMMENT='角色权限关系表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
用户表 | 用户角色关系表
CREATE TABLE `sys_user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(64) NOT NULL DEFAULT '0' COMMENT '用户名',
`password` VARCHAR(64) NOT NULL DEFAULT '0' COMMENT '密码',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`org_id` INT(11) NOT NULL COMMENT '组织id',
`enabled` INT(11) NULL DEFAULT NULL COMMENT '0无效用户,1是有效用户',
`phone` VARCHAR(16) NULL DEFAULT NULL COMMENT '手机号',
`email` VARCHAR(32) NULL DEFAULT NULL COMMENT 'email',
PRIMARY KEY (`id`)
)
COMMENT='用户信息表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
CREATE TABLE `sys_user_role` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`role_id` INT(11) NOT NULL DEFAULT '0' COMMENT '角色自增id',
`user_id` INT(11) NOT NULL DEFAULT '0' COMMENT '用户自增id',
PRIMARY KEY (`id`)
)
COMMENT='用户角色关系表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
插入数据
完整SQL脚本
/*
SQLyog Ultimate v12.5.0 (64 bit)
MySQL - 5.7.30 : Database - oauth
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`oauth` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `oauth`;
/*Table structure for table `sys_menu` */
DROP TABLE IF EXISTS `sys_menu`;
CREATE TABLE `sys_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`menu_pid` int(11) NOT NULL COMMENT '父菜单ID',
`menu_pids` varchar(64) NOT NULL COMMENT '当前菜单所有父菜单',
`is_leaf` tinyint(4) NOT NULL COMMENT '0:不是叶子节点,1:是叶子节点',
`menu_name` varchar(16) NOT NULL COMMENT '菜单名称',
`url` varchar(64) DEFAULT NULL COMMENT '跳转URL',
`icon` varchar(45) DEFAULT NULL,
`icon_color` varchar(16) DEFAULT NULL,
`sort` tinyint(4) DEFAULT NULL COMMENT '排序',
`level` tinyint(4) NOT NULL COMMENT '菜单层级',
`status` tinyint(4) NOT NULL COMMENT '0:启用,1:禁用',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='系统菜单表';
/*Data for the table `sys_menu` */
insert into `sys_menu`(`id`,`menu_pid`,`menu_pids`,`is_leaf`,`menu_name`,`url`,`icon`,`icon_color`,`sort`,`level`,`status`) values
(1,0,'0',0,'系统管理','',NULL,NULL,1,1,0),
(2,1,'1',1,'用户管理','/sysuser',NULL,NULL,1,2,0),
(3,1,'1',1,'日志管理','/syslog','',NULL,2,2,0),
(4,1,'1',1,'业务1','/biz1',NULL,NULL,3,2,0),
(5,1,'1',1,'业务2','/biz2',NULL,NULL,4,2,0);
/*Table structure for table `sys_org` */
DROP TABLE IF EXISTS `sys_org`;
CREATE TABLE `sys_org` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`org_pid` int(11) NOT NULL COMMENT '上级组织编码',
`org_pids` varchar(64) NOT NULL COMMENT '所有的父节点id',
`is_leaf` tinyint(4) NOT NULL COMMENT '0:不是叶子节点,1:是叶子节点',
`org_name` varchar(32) NOT NULL COMMENT '组织名',
`address` varchar(64) DEFAULT NULL COMMENT '地址',
`phone` varchar(13) DEFAULT NULL COMMENT '电话',
`email` varchar(32) DEFAULT NULL COMMENT '邮件',
`sort` tinyint(4) DEFAULT NULL COMMENT '排序',
`level` tinyint(4) NOT NULL COMMENT '组织层级',
`status` tinyint(4) NOT NULL COMMENT '0:启用,1:禁用',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='系统组织结构表';
/*Data for the table `sys_org` */
insert into `sys_org`(`id`,`org_pid`,`org_pids`,`is_leaf`,`org_name`,`address`,`phone`,`email`,`sort`,`level`,`status`) values
(1,0,'0',0,'总部','总部地址','13322223333','zongbu@qq.com',1,1,1),
(2,1,'1',0,'研发部','研发部地址','12222222222','yanfabu@qq.com',1,2,1),
(3,2,'1,2',1,'研发一部','研发一部地址','12222222222','yanfayibu@qq.com',1,3,1),
(4,2,'1,2',1,'研发二部','研发二部地址','13344443333','yanfaerbu@qq.com',2,3,1);
/*Table structure for table `sys_role` */
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`role_name` varchar(32) NOT NULL DEFAULT '0' COMMENT '角色名称(汉字)',
`role_desc` varchar(128) NOT NULL DEFAULT '0' COMMENT '角色描述',
`role_code` varchar(32) NOT NULL DEFAULT '0' COMMENT '角色的英文code.如:ADMIN',
`sort` int(11) NOT NULL DEFAULT '0' COMMENT '角色顺序',
`status` int(11) DEFAULT NULL COMMENT '0表示可用',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '角色的创建日期',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='系统角色表';
/*Data for the table `sys_role` */
insert into `sys_role`(`id`,`role_name`,`role_desc`,`role_code`,`sort`,`status`,`create_time`) values
(1,'管理员','管理员','admin',1,0,'2020-07-23 14:33:40'),
(2,'普通用户','普通用户','common',2,0,'2020-07-23 14:34:11');
/*Table structure for table `sys_role_menu` */
DROP TABLE IF EXISTS `sys_role_menu`;
CREATE TABLE `sys_role_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`role_id` int(11) NOT NULL DEFAULT '0' COMMENT '角色id',
`menu_id` int(11) NOT NULL DEFAULT '0' COMMENT '权限id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='角色权限关系表';
/*Data for the table `sys_role_menu` */
insert into `sys_role_menu`(`id`,`role_id`,`menu_id`) values
(1,1,2),
(2,1,3),
(3,2,4),
(4,2,5);
/*Table structure for table `sys_user` */
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(64) NOT NULL DEFAULT '0' COMMENT '用户名',
`password` varchar(64) NOT NULL DEFAULT '0' COMMENT '密码',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`org_id` int(11) NOT NULL COMMENT '组织id',
`enabled` int(11) DEFAULT NULL COMMENT '0无效用户,1是有效用户',
`phone` varchar(16) DEFAULT NULL COMMENT '手机号',
`email` varchar(32) DEFAULT NULL COMMENT 'email',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='用户信息表';
/*Data for the table `sys_user` */
insert into `sys_user`(`id`,`username`,`password`,`create_time`,`org_id`,`enabled`,`phone`,`email`) values
(1,'admin','123456','2020-07-23 11:16:13',1,1,'13333333333','1@qq.com'),
(2,'user','123456','2020-07-23 11:16:37',2,1,'12222222222','2@qq.com');
/*Table structure for table `sys_user_role` */
DROP TABLE IF EXISTS `sys_user_role`;
CREATE TABLE `sys_user_role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`role_id` int(11) NOT NULL DEFAULT '0' COMMENT '角色自增id',
`user_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户自增id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='用户角色关系表';
/*Data for the table `sys_user_role` */
insert into `sys_user_role`(`id`,`role_id`,`user_id`) values
(1,1,1),
(2,2,2);
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;