在本號以前的文章中,已經爲你們介紹了不少關於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。因此一般須要爲了方便管理組織之間的上下級樹形關係,須要加上一些特殊字段,如:orgpids:該組織全部上級組織id逗號分隔,即包括上級的上級;isleaf是不是葉子結點;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
;複製代碼
在用戶的信息表中,體現了一些隱藏的需求。如:屢次登陸鎖定與鎖定到期時間的關係。帳號有效期的設定規則等。編碼
固然用戶表中,根據業務的不一樣還可能加更多的信息,好比:用戶頭像等等。可是一般在比較大型的業務系統開發中,業務模塊中使用的用戶表和在權限管理模塊使用的用戶表一般不是一個,而是根據某些惟一字段弱關聯,分開存放。這樣作的好處在於:常常發生變化的業務需求,不會去影響不常常變化的權限模型。