1. 程式人生 > >springboot shiro許可權控制講解01 每天進步百分之一

springboot shiro許可權控制講解01 每天進步百分之一

許可權大體分兩種,操作許可權和資料許可權,以下主要講操作許可權的控制
操作許可權是一個管理系統的基本功能,最最簡單的就是驗證使用者的帳號和密碼了
那既然驗證,就有一張使用者表了,想起這個就想起的大學老師佈置做的學生管理系統了
第一天 學生登入檢視自己的基本資訊
拿到這個題目然後就回宿舍屁顛屁顛的寫程式碼了
先來個表
使用者表 欄位id ,帳號,密碼
邏輯是 根據使用者名稱和密碼去查詢是否有這個使用者的記錄
有就進入主頁檢視自己的資訊了,沒有就提示使用者名稱密碼錯誤,重新輸入密碼
基本上就all 了

第二天老師又來題目了
老師也可以登入查詢的是所有學生的資訊
那時候瞬間矇蔽了,這個怎麼玩啊?!
後來一看學校的管理系統也有這個,就是在頁面登入頁加個選項,選擇是學生還是老師
知道了個大概,趕緊開幹
根據頁面的選擇型別去查學生的資訊
比如type是1就查學生自己的一條
type 是2 就查所有的學生記錄
基本上這樣就算是all 了,角色的概念出來了

第三天老師又說再系統再加個選單,只有老師可以看,這個邏輯判斷基本跟上面差不多,但是選單資源是不是也出來了, 怎麼命名看你心情(資源也好,選單也好)

到這裡角色基本的三大角就出來了

使用者-角色-選單

那怎麼關聯這三張表呢?先看下面幾種情況
先看使用者和角色的關係
一個使用者可能有兩種以及多種角色,如張三是教務主任,同時兼任老師
一個角色可能有多個使用者 如老師這個角色
然後看角色和選單的關係
一個角色擁有多個選單,沒毛病
一個選單被多個角色擁有 如學生檔案這個選單,校長老師這兩個角色都可以看,沒毛病

這樣我們就得再加兩個表,角色和使用者的關係表,角色和選單的關係表

這樣基本通用的操作許可權體系就出來了

下面講下登入功能的邏輯
常見的登入頁面
使用者名稱:
密碼:
驗證碼:
記住密碼:

登入方法邏輯
1. 驗證驗證碼是否正確
2. 驗證使用者名稱和密碼是否正確 (密碼加密)
3. 是否點選了記住密碼
4. 查詢使用者的角色
5. 查詢角色下的操作的資源許可權(選單:操作(增刪改))
6. 將使用者許可權的資訊儲存到快取中,減少對資料庫的I/O操作
7. 登入成功跳轉
8. 退出登入
9. 客戶端還有(忘記密碼功能,手機郵箱驗證,第三方登入等)
大體登入的功能項是這樣了,老鐵沒毛病吧?
接下來主角登場—》Shiro用一個框架最起碼要知道的三要素 一,什麼玩意? 二 有啥好處? 三 怎麼玩?
一. Apache Shiro是Java的一個安全框架
二.
Shiro可以非常容易的開發出足夠好的應用,其不僅可以用在JavaSE環境,也可以用在JavaEE環境。Shiro可以幫助我們完成:認證、授權、加密、會話管理、與Web整合、快取等。這不就是我們想要的嘛

2. Authentication:身份認證/登入,驗證使用者是不是擁有相應的身份
Cryptography:加密,保護資料的安全性,如密碼加密儲存到資料庫,而不是明文儲存;
5. Authorization:授權,即許可權驗證,驗證某個已認證的使用者是否擁有某個許可權;即判斷使用者是否能做事情,常見的如:驗證某個使用者是否擁有某個角色。或者細粒度的驗證某個使用者對某個資源是否具有某個許可權;
6. Session Manager:會話管理,即使用者登入後就是一次會話,在沒有退出之前,它的所有資訊都在會話中;會話可以是普通JavaSE環境的,也可以是如Web環境的;
Caching:快取,比如使用者登入後,其使用者資訊、擁有的角色/許可權不必每次去查,這樣可以提高效率;
3 Remember Me:記住我,這個是非常常見的功能,即一次登入後,下次再來的話不用登入了。
三.就是怎麼玩了,進入主題

Springboot shiro整合
1. 老套路
引入架包

            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-core</artifactId>
                <version>${shiro.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-spring</artifactId>
                <version>${shiro.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-ehcache</artifactId>
                <version>${shiro.version}</version>
            </dependency>

2.建表
使用者表

CREATE TABLE `sys_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(128) NOT NULL COMMENT '使用者名稱',
  `nickname` varchar(128) DEFAULT NULL COMMENT '別名',
  `password` varchar(128) DEFAULT NULL COMMENT '密碼',
  `salt` varchar(32) DEFAULT NULL COMMENT '鹽',
  `email` varchar(64) DEFAULT NULL COMMENT '郵箱',
  `mobile` varchar(32) DEFAULT NULL COMMENT '手機號碼',
  `status` tinyint(4) DEFAULT NULL COMMENT '狀態  0:禁用   1:正常',
  `dept_id` bigint(20) DEFAULT NULL COMMENT '部門ID',
  `create_time` datetime DEFAULT NULL COMMENT '建立時間',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  KEY `email` (`email`),
  KEY `mobile` (`mobile`),
  KEY `status` (`status`),
  KEY `dept_id` (`dept_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='系統使用者';

角色表

CREATE TABLE `sys_role` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(128) DEFAULT NULL COMMENT '角色名稱',
  `remark` varchar(256) DEFAULT NULL COMMENT '備註',
  `create_time` datetime DEFAULT NULL COMMENT '建立時間',
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色';

選單資源表

CREATE TABLE `sys_menu` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `parent_id` bigint(20) DEFAULT NULL COMMENT '父選單ID,一級選單為0',
  `name` varchar(128) DEFAULT NULL COMMENT '選單名稱',
  `url` varchar(256) DEFAULT NULL COMMENT '選單URL',
  `perms` varchar(500) DEFAULT NULL COMMENT '授權(多個用逗號分隔,如:user:list,user:create)',
  `type` tinyint(4) DEFAULT NULL COMMENT '型別   0:目錄   1:選單   2:按鈕',
  `icon` varchar(256) DEFAULT NULL COMMENT '選單圖示',
  `order_num` int(11) DEFAULT NULL COMMENT '排序號',
  PRIMARY KEY (`id`),
  KEY `parent_id` (`parent_id`),
  KEY `type` (`type`)
) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8mb4 COMMENT='選單管理';

使用者和角色的關聯表

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

角色和選單的關係表

CREATE TABLE `sys_role_menu` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `role_id` bigint(20) NOT NULL COMMENT '角色ID',
  `menu_id` bigint(20) NOT NULL COMMENT '選單ID',
  PRIMARY KEY (`id`),
  KEY `role_id` (`role_id`),
  KEY `menu_id` (`menu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色與選單對應關係';

上面所說的基本許可權的5張表就建好了.
建立實體以及service,mapper層,在test測試
這玩意複製過來有點多,看原始碼
https://gitee.com/aliww_411741962/getbang.git
對應這五個表對應的實體先測試一下,沒問題接著走下一步