在本号以前的文章中,已经为你们介绍了不少关于Spring Security的使用方法,也介绍了RBAC的基于角色权限控制模型。可是不少朋友虽然已经理解了RBAC控制模型,可是仍有不少的问题阻碍他们进一步开发。好比:mysql
那么本文就但愿将这些问题,与你们进行一下分享。spring
上图中:sql
本文讲解只将权限控制到菜单的访问级别,即控制页面的访问权限。若是想控制到页面中按钮级别的访问,能够参考Menu与RoleMenu的模式一样的实现方式。或者干脆在menu表里面加上一个字段区别该条记录是菜单项仍是按钮。数据库
为了有理有据,咱们参考一个比较优秀的开源项目:若依后台管理系统。后端
之因此先将部门管理提出来说一下,是由于部门管理没有在咱们上面的RBAC权限模型中进行提现。可是部门这样一个实体仍然是,后端管理系统的一个重要组成部分。一般有以下的需求:springboot
如下SQL以MySQL为例:oracle
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 ;
注意:mysql没有oracle中的start with connect by的树形数据汇总SQL。因此一般须要为了方便管理组织之间的上下级树形关系,须要加上一些特殊字段,如:org_pids:该组织全部上级组织id逗号分隔,即包括上级的上级;is_leaf是不是叶子结点;level组织所属的层级(1,2,3)。框架
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:是叶子节点', `name` VARCHAR(16) NOT NULL COMMENT '菜单名称', `url` VARCHAR(64) NOT 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_id` VARCHAR(16) NOT NULL COMMENT '角色ID', `role_name` VARCHAR(16) NOT NULL COMMENT '角色名', `role_flag` VARCHAR(64) NULL DEFAULT NULL COMMENT '角色标识', `sort` INT(11) NULL DEFAULT NULL 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` VARCHAR(16) NOT NULL COMMENT '角色ID', `menu_id` INT(11) NOT NULL COMMENT '菜单ID', PRIMARY KEY (`id`) ) COMMENT='角色菜单多对多关联表' COLLATE='utf8_general_ci' ENGINE=InnoDB ;
CREATE TABLE `sys_user` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `org_id` INT(11) NOT NULL, `username` VARCHAR(64) NULL DEFAULT NULL COMMENT '用户名', `password` VARCHAR(64) NULL DEFAULT NULL COMMENT '密码', `enabled` INT(11) NULL DEFAULT '1' COMMENT '用户帐户是否可用', `locked` INT(11) NULL DEFAULT '0' COMMENT '用户帐户是否被锁定', `lockrelease_time` TIMESTAMP NULL '用户帐户锁定到期时间', `expired_time` TIMESTAMP NULL '用户帐户过时时间', `create_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '用户帐户建立时间', PRIMARY KEY (`id`) ) COMMENT='用户信息表' ENGINE=InnoDB ;
CREATE TABLE `sys_user_role` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `role_id` VARCHAR(16) NULL DEFAULT NULL, `user_id` VARCHAR(18) NULL DEFAULT NULL, PRIMARY KEY (`id`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB ;
在用户的信息表中,体现了一些隐藏的需求。如:屡次登陆锁定与锁定到期时间的关系。帐号有效期的设定规则等。编码
固然用户表中,根据业务的不一样还可能加更多的信息,好比:用户头像等等。可是一般在比较大型的业务系统开发中,业务模块中使用的用户表和在权限管理模块使用的用户表一般不是一个,而是根据某些惟一字段弱关联,分开存放。这样作的好处在于:常常发生变化的业务需求,不会去影响不常常变化的权限模型。