Like Share Discussion Bookmark Smile

J.J. Huang   2019-04-30   Spring Boot   瀏覽次數:

SpringBoot - 第四十一章 | Apache Shiro 安全控制

不得不說這篇拖的時間有點長,一方面是因為在確認文章的後期要再繼續寫什麼,二方面是這個Shiro我花了點時間研究。
這邊文章中使用到的有mysql、jpa、thymeleaf、shiro,如果不太清楚這些的使用方式,可以參考下面這些文章。

Docker - 第四章 | 安裝MySQL
SpringBoot - 第十四章 | Spring-data-jpa訪問資料庫
SpringBoot - 第四章 | Web開發(Thymeleaf)


環境準備

  • Docker 資料庫準備
  • CREATE DATABASE test;

相關配置

  • 加入pom的依賴

    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.4.0</version>
    </dependency>
  • src/main/resources/application.properties中配置資料源訊息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    # 資料源配置
    spring.datasource.url=jdbc:mysql://localhost:3306/test
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver

    # 顯示SQL語法
    spring.jpa.show-sql=true
    # format SQL語法
    spring.jpa.properties.hibernate.format_sql=true

    # 顯示SQL語法的查詢條件的值
    logging.level.org.hibernate.SQL=DEBUG
    logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

    # 自動建立(此參數請小心使用)
    # validate 加載hibernate時,驗證建立資料庫表結構
    # create 每次加載hibernate,重新建立資料庫表結構,這就是導致資料庫表資料丟失的原因。
    # create-drop 加載hibernate時建立,退出是刪除表結構
    # update 加載hibernate自動更新資料庫結構
    # validate 啟動時驗證表的結構,不會建立表
    # none 啟動時不做任何操作
    spring.jpa.properties.hibernate.hbm2ddl.auto=update

    # 建議在開發時關閉緩存,不然沒法看到實時頁面
    spring.thymeleaf.cache=false
    # 去除thymeleaf的html嚴格校驗
    spring.thymeleaf.mode=LEGACYHTML5

spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置屬性,其主要作用是:自動建立、更新、驗證資料庫表結構。參數說明可以參考這篇文章連結


建立實體 (Entity)

  • User(用戶表)、Role(角色表)、Menu(功能表)

建立資料訪問對象 (Dao)


建立ShiroConfig


建立MyShiroRealm


建立LoginController


建立.html

  • index、login、select、delete、403

測試用SQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
INSERT INTO `test`.`menu`(`menu_id`, `menu_name`) VALUES (1, 'add');
INSERT INTO `test`.`menu`(`menu_id`, `menu_name`) VALUES (2, 'delete');
INSERT INTO `test`.`menu`(`menu_id`, `menu_name`) VALUES (3, 'update');
INSERT INTO `test`.`menu`(`menu_id`, `menu_name`) VALUES (4, 'select');
INSERT INTO `test`.`role`(`role_id`, `role_name`) VALUES (1, 'admin');
INSERT INTO `test`.`role`(`role_id`, `role_name`) VALUES (2, 'user');
INSERT INTO `test`.`sys_role_menu`(`role_id`, `menu_id`) VALUES (1, 1);
INSERT INTO `test`.`sys_role_menu`(`role_id`, `menu_id`) VALUES (1, 2);
INSERT INTO `test`.`sys_role_menu`(`role_id`, `menu_id`) VALUES (1, 3);
INSERT INTO `test`.`sys_role_menu`(`role_id`, `menu_id`) VALUES (1, 4);
INSERT INTO `test`.`sys_role_menu`(`role_id`, `menu_id`) VALUES (2, 4);
INSERT INTO `test`.`user`(`user_id`, `pass_word`, `user_name`) VALUES (1, '123456', 'J.J.Huang');
INSERT INTO `test`.`user`(`user_id`, `pass_word`, `user_name`) VALUES (2, '123456', 'I.I.Huang');
INSERT INTO `test`.`sys_user_role`(`role_id`, `user_id`) VALUES (1, 1);
INSERT INTO `test`.`sys_user_role`(`role_id`, `user_id`) VALUES (2, 2);

測試

啟動應用並瀏覽 http://localhost:8080/

因為還沒有登入的情況下,所以被導到login頁面

登入後,就會導回到當初的頁面index

按下登出後回到login頁

輸入錯誤密碼登入

確認是否有select權限,瀏覽 http://localhost:8080/select ,並登入,見到select,表示有權限

確認是否有delete權限,瀏覽 http://localhost:8080/delete ,並登入,見到delete,表示有權限

註:以上參考了
Apache Shiro | Simple. Java. Security.
Dalaoyang使用shiro安全管理 文章。
Shiro入门这篇就够了【Shiro的基础知识、回顾URL拦截】
springboot整合shiro应用