Spring Boot 整合 Shiro,兩種方式全總結

2020-12-24 程序猿的內心獨白

在 Spring Boot 中做權限管理,一般來說,主流的方案是 Spring Security ,但是,僅僅從技術角度來說,也可以使用 Shiro。

今天松哥就來和大家聊聊 Spring Boot 整合 Shiro 的話題!

一般來說,Spring Security 和 Shiro 的比較如下:

Spring Security 是一個重量級的安全管理框架;Shiro 則是一個輕量級的安全管理框架

Spring Security 概念複雜,配置繁瑣;Shiro 概念簡單、配置簡單

Spring Security 功能強大;Shiro 功能簡單

雖然 Shiro 功能簡單,但是也能滿足大部分的業務場景。所以在傳統的 SSM 項目中,一般來說,可以整合 Shiro。

在 Spring Boot 中,由於 Spring Boot 官方提供了大量的非常方便的開箱即用的 Starter ,當然也提供了 Spring Security 的 Starter ,使得在 Spring Boot 中使用 Spring Security 變得更加容易,甚至只需要添加一個依賴就可以保護所有的接口,所以,如果是 Spring Boot 項目,一般選擇 Spring Security 。

這只是一個建議的組合,單純從技術上來說,無論怎麼組合,都是沒有問題的。

在 Spring Boot 中整合 Shiro ,有兩種不同的方案:

第一種就是原封不動的,將 SSM 整合 Shiro 的配置用 Java 重寫一遍。

第二種就是使用 Shiro 官方提供的一個 Starter 來配置,但是,這個 Starter 並沒有簡化多少配置。

原生的整合

創建項目創建一個 Spring Boot 項目,只需要添加 Web 依賴即可:

項目創建成功後,加入 Shiro 相關的依賴,完整的 pom.xml 文件中的依賴如下:

<dependencies><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency></dependencies>

創建 Realm

接下來我們來自定義核心組件 Realm:

public class MyRealm extends AuthorizingRealm {@Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return null; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String) token.getPrincipal(); if (!"javaboy".equals(username)) { throw new UnknownAccountException("帳戶不存在!"); } return new SimpleAuthenticationInfo(username, "123", getName()); }}

在 Realm 中實現簡單的認證操作即可,不做授權,授權的具體寫法和 SSM 中的 Shiro 一樣,不贅述。這裡的認證表示用戶名必須是 javaboy ,用戶密碼必須是 123 ,滿足這樣的條件,就能登錄成功!

配置 Shiro

接下來進行 Shiro 的配置:

@Configurationpublic class ShiroConfig {@Bean MyRealm myRealm() { return new MyRealm(); } @Bean SecurityManager securityManager() { DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); manager.setRealm(myRealm()); return manager; } @Bean ShiroFilterFactoryBean shiroFilterFactoryBean() { ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); bean.setSecurityManager(securityManager()); bean.setLoginUrl("/login"); bean.setSuccessUrl("/index"); bean.setUnauthorizedUrl("/unauthorizedurl"); Map<String, String> map = new LinkedHashMap<>(); map.put("/doLogin", "anon"); map.put("/**", "authc"); bean.setFilterChainDefinitionMap(map); return bean; }}

在這裡進行 Shiro 的配置主要配置 3 個 Bean :

首先需要提供一個 Realm 的實例。

需要配置一個 SecurityManager,在 SecurityManager 中配置 Realm。

配置一個 ShiroFilterFactoryBean ,在 ShiroFilterFactoryBean 中指定路徑攔截規則等。

配置登錄和測試接口。

其中,ShiroFilterFactoryBean 的配置稍微多一些,配置含義如下:

setSecurityManager 表示指定 SecurityManager。

setLoginUrl 表示指定登錄頁面。

setSuccessUrl 表示指定登錄成功頁面。

接下來的 Map 中配置了路徑攔截規則,注意,要有序。

這些東西都配置完成後,接下來配置登錄 Controller:

@RestControllerpublic class LoginController {@PostMapping("/doLogin") public void doLogin(String username, String password) { Subject subject = SecurityUtils.getSubject(); try { subject.login(new UsernamePasswordToken(username, password)); System.out.println("登錄成功!"); } catch (AuthenticationException e) { e.printStackTrace(); System.out.println("登錄失敗!"); } } @GetMapping("/hello") public String hello() { return "hello"; } @GetMapping("/login") public String login() { return "please login!"; }}

測試時,首先訪問 /hello 接口,由於未登錄,所以會自動跳轉到 /login 接口:

然後調用 /doLogin 接口完成登錄:

再次訪問 /hello 接口,就可以成功訪問了:

使用 Shiro Starter

上面這種配置方式實際上相當於把 SSM 中的 XML 配置拿到 Spring Boot 中用 Java 代碼重新寫了一遍,除了這種方式之外,我們也可以直接使用 Shiro 官方提供的 Starter 。

創建工程,和上面的一樣建成功後,添加 shiro-spring-boot-web-starter ,這個依賴可以代替之前的 shiro-web 和 shiro-spring 兩個依賴,pom.xml 文件如下:

<dependencies><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-web-starter</artifactId> <version>1.4.0</version> </dependency></dependencies>

創建 Realm

這裡的 Realm 和前面的一樣,我就不再贅述。

配置 Shiro 基本信息

接下來在 application.properties 中配置 Shiro 的基本信息:

shiro.sessionManager.sessionIdCookieEnabled=trueshiro.sessionManager.sessionIdUrlRewritingEnabled=trueshiro.unauthorizedUrl=/unauthorizedurlshiro.web.enabled=trueshiro.successUrl=/indexshiro.loginUrl=/login

配置解釋:

第一行表示是否允許將sessionId 放到 cookie 中

第二行表示是否允許將 sessionId 放到 Url 地址攔中

第三行表示訪問未獲授權的頁面時,默認的跳轉路徑

第四行表示開啟 shiro

第五行表示登錄成功的跳轉頁面

第六行表示登錄頁面

配置 ShiroConfig

@Configurationpublic class ShiroConfig {@Bean MyRealm myRealm() { return new MyRealm(); } @Bean DefaultWebSecurityManager securityManager() { DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); manager.setRealm(myRealm()); return manager; } @Bean ShiroFilterChainDefinition shiroFilterChainDefinition() { DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition(); definition.addPathDefinition("/doLogin", "anon"); definition.addPathDefinition("/**", "authc"); return definition; }}

這裡的配置和前面的比較像,但是不再需要 ShiroFilterFactoryBean 實例了,替代它的是 ShiroFilterChainDefinition ,在這裡定義 Shiro 的路徑匹配規則即可。

這裡定義完之後,接下來的登錄接口定義以及測試方法都和前面的一致,我就不再贅述了。大家可以參考上文。

總結

本文主要向大家介紹了 Spring Boot 整合 Shiro 的兩種方式,一種是傳統方式的 Java 版,另一種則是使用 Shiro 官方提供的 Starter,兩種方式,不知道大家有沒有學會呢?

本文案例,我已經上傳到 GitHub ,歡迎大家 star:https://github.com/lenve/javaboy-code-samples

關於本文,有問題歡迎留言討論。

原文:https://blog.csdn.net/u012702547/article/details/91413078

相關焦點

  • spring boot 整合shiro 錯誤
    最近在弄spring boot 整合shiro的。凱哥現在用的是spring boot。web.xml沒有。但是凱哥配置了shiro的核心攔截器啊。如下圖:並且使用了@Configuration這個註解了。
  • Spring Boot與Shiro整合實現用戶認證
    Spring Boot整合Shiro1.2.1. 導入shiro與spring整合依賴修改pom.xml<!-- shiro與spring整合依賴 --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version
  • Spring Boot 2.4 安裝
    一個需要注意的是,你的項目如果需要轉換為 Spring Boot 的項目的話,你的項目必須是 spring-boot-starter-parent的子項目。安裝 Spring BootSpring Boot 可以通過使用 「傳統(classic)」 的 Java 開發工具或者安裝一個命令行工具(command line tool)。
  • Spring Shiro 學習系統 Spring-Shiro-training
    Spring-Shiro-training 詳細介紹Spring Shiro 學習系統簡介基於 springmvc、spring、mybatis-plus、shiro技術和功能Spring-cache、Spring-data-redis、Spring-Task、Shiro、Spring-cache-shiro、maven profile 多環境配置權限管理、角色管理、用戶管理、部門管理、登陸日誌、圖標管理
  • Spring Boot Admin快速打造監控平臺
    今天我們介紹一個可視化的監控指標平臺Spring Boot Admin,它利用spring-boot-starter-actuator提供的功能,將各個微服務的狀態整合到一起,並提供良好的界面查看支持,並且能夠動態的修改實例日誌級別
  • Spring Boot 啟動事件和監聽器,太強大了!
    Spring Boot 基礎的構建這裡就不介紹了,如果你對 Spring Boot 還不是很熟悉,或者只是會簡單的使用,那還是建議你深入學習下吧,推薦這個 Spring Boot 學習倉庫,歡迎 Star 關注:https://github.com/javastacks/spring-boot-best-practice1、新建監聽器
  • 反爬蟲防盜刷 Spring Boot 組件 kk-anti-reptile 初版發布
    kk-anti-reptile 是適用於基於spring-boot開發的分布式系統的反爬蟲組件系統要求 基於spring-boot開發(spring-boot1
  • web應用安全框架選型:Spring Security與Apache Shiro
    shiro的使用量一直高於spring security.Spring Security與Apache Shiro2.2.使用的方便程度通常來說,shiro入門更加容易,使用起來也非常簡單,這也是造成shiro的使用量一直高於Spring Security的主要原因。
  • oauth2-shiro 0.1-beta 發布
    經過不斷地試錯與研究, 整合oauth2與shiro的 oauth2-shiro項目 0.1-beta 發布. 整合Apache Oltu 與 Shiro.
  • 如何在Spring Boot項目中集成微信支付V3
    演示例子: payment-spring-boot-samples文檔:Payment Spring Boot文檔有疑問請提交ISSUE會及時跟進,歡迎Star ,歡迎PR貢獻。Spring Boot實現微信支付V3 基礎支付實現微信支付V3 合單支付實現微信支付V3 代金券實現微信支付V3 微信支付分實現微信支付V3 先享卡Maven 中央倉庫坐標最新版本的坐標為:<dependency> <groupId>cn.felord</groupId> <artifactId>payment-spring-boot-starter
  • Spring boot 2.1.8 中 @SpringBootApplication 註解來源
    簡介啟動Spring boot 時,啟動類中有個註解 @SpringBootApplication查看源碼其中標註的三個註解正能解決我們上面所說的三種功能>[] exclude() default {}:根據 class 來排除,排除特定的類加入 spring 容器,傳入參數 value 類型是 class 類型。
  • Spring Boot 2.4 從早期版本進行升級
    如果你希望啟用上面的這個特性的話,請將下面的依賴添加到你的項目中:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-properties-migrator</artifactId>
  • 使用IntelliJ IDEA創建Spring Boot項目
    1.2 填寫項目信息在此步驟中,需要指定一些必要的項目信息,它們是:Group:項目的groupId,例如com.ramostearArtifact:項目的artifactId,例如hello-springbootType:項目的構建方式,默認為
  • Spring Boot集成validation用於優雅的校驗API參數的合法性
    ,郵箱格式是否正確等等,校驗框架比較多,用的比較多的是hibernate-validator, 也支持國際化,也可以自定義校驗類型的註解,這裡只是簡單的演示校驗框架在Spring Boot中的簡單集成,要想了解更多可以參考 hibernate-validator1. pom.xml<dependency> <groupId>org.springframework.boot
  • Rocket-API 2.3.2 發布,基於 spring boot 的 API 敏捷開發框架
    功能新增或修改: 遠程部署重複判斷 添加mongo對象操作函數 mapping路徑匹配修改,解決restful下路徑可能會匹配執行邏輯錯誤問題 增加配置項 駝峰轉換配置 spring.rocket-api.map-underscore-to-camel-case
  • springboot2.1.5集成fineReport報表工具
    在pom.xml中設置打包時將項目中libs文件夾下的jar也打包進去<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin
  • 這兩種方式可以獲取
    概述在本文中,我們將探索在容器中獲取所有spring管理的bean的相關技術。這有神馬用?主要是用於排查問題。一般都是我們創建的某一個bean沒有啟動的問題。畢竟工作中總是會遇到各種各樣的bug。提前了解一些沒有壞處。2. IoC容器bean是spring管理的應用程式的基礎,所有bean都駐留在IOC容器中,該容器負責管理它們的生命周期。
  • javaEE開發必用的技術 ssm框架+shiro框架實現權限控制及認證
    本文使用shiro框架來完成認證和授權,同功能的框架還有一種叫做spring security,spring保安的框架,他倆的區別就是一個是Apache旗下的一個是Spring旗下的,具體哪個好你們可以自己去體驗體驗。shiro是基於過濾器完成權限控制的,所以我們要在web.xml中給shiro配置一個專屬過濾器。
  • web開發實戰教程:Apache Shiro在web項目的應用
    shiro安全框架是目前為止作為登錄註冊最常用的框架,因為它十分的強大簡單,提供了認證、授權、加密和會話管理等功能 。shiro能做什麼?認證:驗證用戶的身份授權:對用戶執行訪問控制:判斷用戶是否被允許做某事會話管理:在任何環境下使用 Session API,即使沒有 Web 或EJB 容器。
  • 老的SpringMVC項目接入shiro步驟
    現在想接入shiro把權限這塊管理起來。關於shiro網上的資料已經很多了,我就不重複了。直接開搞。先要在web.xml中配置shiro過濾器,接管所有請求。<!-- 使用shiro認證 --><!