springboot專題系列六:基於RBAC的許可權模型+shiro+springboot實現的系統登陸許可權認證模組

語言: CN / TW / HK

「這是我參與2022首次更文挑戰的第22天,活動詳情檢視:2022首次更文挑戰

如果不清楚RBAC許可權模型的可以參考一下連線: 許可權系統與RBAC模型概述[絕對經典] 方案實現步驟如下:

一. 基本的許可權的資料庫表

  1. 使用者表 ~~~sql CREATE TABLE sys_user ( user_id bigint(20) NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL COMMENT '使用者名稱', password varchar(100) DEFAULT NULL COMMENT '密碼', salt varchar(20) DEFAULT NULL COMMENT '鹽', email varchar(100) DEFAULT NULL COMMENT '郵箱', mobile varchar(100) DEFAULT NULL COMMENT '手機號', status tinyint(4) DEFAULT NULL COMMENT '狀態 0:禁用 1:正常', create_user_id bigint(20) DEFAULT NULL COMMENT '建立者ID', create_time datetime DEFAULT NULL COMMENT '建立時間', PRIMARY KEY (user_id), UNIQUE KEY username (username) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='系統使用者'; ~~~
  2. 選單表(許可權表) ~~~sql CREATE TABLE sys_menu ( menu_id bigint(20) NOT NULL AUTO_INCREMENT, parent_id bigint(20) DEFAULT NULL COMMENT '父選單ID,一級選單為0', name varchar(50) DEFAULT NULL COMMENT '選單名稱', url varchar(200) DEFAULT NULL COMMENT '選單URL', perms varchar(500) DEFAULT NULL COMMENT '授權(多個用逗號分隔,如:user:list,user:create)', type int(11) DEFAULT NULL COMMENT '型別 0:目錄 1:選單 2:按鈕', icon varchar(50) DEFAULT NULL COMMENT '選單圖示', order_num int(11) DEFAULT NULL COMMENT '排序', PRIMARY KEY (menu_id) ) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 COMMENT='選單管理'; ~~~
  3. 角色表 ~~~sql CREATE TABLE sys_role ( role_id bigint(20) NOT NULL AUTO_INCREMENT, role_name varchar(100) DEFAULT NULL COMMENT '角色名稱', remark varchar(100) DEFAULT NULL COMMENT '備註', create_user_id bigint(20) DEFAULT NULL COMMENT '建立者ID', create_time datetime DEFAULT NULL COMMENT '建立時間', PRIMARY KEY (role_id) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='角色'; ~~~

  4. 角色和選單關聯表 ~~~sql CREATE TABLE sys_role_menu ( id bigint(20) NOT NULL AUTO_INCREMENT, role_id bigint(20) DEFAULT NULL COMMENT '角色ID', menu_id bigint(20) DEFAULT NULL COMMENT '選單ID', PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 COMMENT='角色與選單對應關係'; ~~~

  5. 使用者和角色關聯表 ~~~sql CREATE TABLE sys_user_role ( id bigint(20) NOT NULL AUTO_INCREMENT, user_id bigint(20) DEFAULT NULL COMMENT '使用者ID', role_id bigint(20) DEFAULT NULL COMMENT '角色ID', PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='使用者與角色對應關係'; ~~~

二. 一些主要程式碼

大體思路,需要維護兩個主要關係,使用者和角色,角色和許可權 ,當用戶登入認證成功以後需要連表查詢出當前登入使用者所能檢視的所有選單和擁有的許可權,並返回前端。當前端訪問帶@RequiresPermissions 註解的介面時也需要連表查詢當前使用者是否有訪問當前方法的許可權。當修改使用者擁有的角色的時候需要將之前把 sys_user_role 表中之前儲存的有關這個使用者的資料刪除掉,再重新儲存。修改某一個角色擁有的許可權的時候也是同樣的道理。 具體的程式碼可以參考一下連線:

https://github.com/Dr-Water/ratel-fast

主要程式碼是如圖紅框所示的類: 在這裡插入圖片描述

關於springboot和shiro的整合,以及驗證碼相關的分析可以參考一下連線:

  1. springboot專案中使用shiro 自定義過濾器和token的方式

  2. springboot專案使用谷歌的kaptcha生成驗證碼超級簡單