最新Spring Security實戰(zhàn)教程之Spring Security安全框架指南
前言
隨著Web應(yīng)用和微服務(wù)架構(gòu)的普及,作為JAVA開發(fā)者如何保證系統(tǒng)免受各種安全威脅(如未經(jīng)授權(quán)的訪問、數(shù)據(jù)泄露、跨站請求偽造等)成為一個我們必須要解決的問題。
Spring Security 作為Spring 生態(tài)系統(tǒng)中的核心組件,通過提供認(rèn)證(Authentication)與授權(quán)(Authorization)和針對常見攻擊等一系列安全功能,為開發(fā)者構(gòu)建安全穩(wěn)定的應(yīng)用提供了強有力的支持。
什么是Spring Security?

官方文檔:https://docs.spring.io/spring-security/reference/index.html
Spring Security是一個基于Spring框架的強大安全解決方案,它為應(yīng)用提供了一整套安全服務(wù),主要包括以下幾個方面:
- 認(rèn)證(Authentication): 確定訪問者身份的過程。Spring Security通過多種方式(如表單登錄、Basic認(rèn)證、OAuth2等)實現(xiàn)用戶身份驗證。
- 授權(quán)(Authorization): 根據(jù)用戶身份和權(quán)限確定資源訪問級別。開發(fā)者可以通過配置或注解的方式,靈活地控制不同用戶對不同資源的訪問權(quán)限。
- 防護機制: 包括防止跨站請求偽造(CSRF)、點擊劫持等攻擊手段,保障應(yīng)用在網(wǎng)絡(luò)攻擊面前的穩(wěn)定性。
這種以攔截器和過濾器鏈為核心的設(shè)計,使得Spring Security能夠在請求到達業(yè)務(wù)邏輯之前,先進行安全檢查,從而構(gòu)建出一層堅固的防護屏障。
同類框架對比
說到安全框架,我們就不得不提另外一個輕量級的安全管理框架 Apache Shiro ,它有三個核心組件:Subject, SecurityManager 和 Realms , Shiro 的相關(guān)內(nèi)容大家可以自行學(xué)習(xí),這里不做過多介紹了
下面博主總結(jié)兩個框架的一些對比:
| 特性 | Spring Security | Apache Shiro |
|---|---|---|
| 學(xué)習(xí)曲線 | 較陡峭 | 易上手 |
| 功能完整性 | ★★★★★ | ★★★☆☆ |
| Spring生態(tài)集成 | 原生支持 | 需要適配 |
| 微服務(wù)支持 | OAuth2/JWT | 需自行擴展 |
| 社區(qū)活躍度 | 極高 | 一般 |
通過上述的對比圖,可以總結(jié)出:
- Spring Security是一個重量級的安全管理框架;Shiro則是一個輕量級的安全管理框架
- Spring Security 上手稍有難度,Shiro 的配置和使用比較簡單
- Shiro 依賴性低,不需要任何框架和容器,可以獨立運行
- 如果你的項目基于Spring容器,那么優(yōu)先推薦Spring Security
Spring Security典型應(yīng)用場景
傳統(tǒng)Web應(yīng)用安全
通過配置實現(xiàn)URL級權(quán)限控制
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login")
.permitAll()
);
return http.build();
}
}前后端分離架構(gòu)
- JWT令牌自動校驗
- 無狀態(tài)會話管理
- 跨域安全配置(CORS)
微服務(wù)安全網(wǎng)關(guān)
資源服務(wù)器配置示例
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://auth-server:9000快速搭建安全環(huán)境
以博主本機環(huán)境為例
JDK 17+
Spring Boot 3.4.3
Maven 3.9+
IDE(IntelliJ IDEA或VS Code)
為了方便大家學(xué)習(xí)給大家提供一個官方代碼案例地址:
https://github.com/spring-projects/spring-security-samples/tree/main
? 創(chuàng)建Spring Boot項目
使用 start.spring.io 生成項目,勾選以下依賴:

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>? 測試安全訪問
創(chuàng)建測試控制器,我們希望訪問 /public 無需驗證身份,訪問 /private 需要用戶登錄
@RestController
public class DemoController {
@GetMapping("/public")
public String publicApi() {
return "無需認(rèn)證的公開接口";
}
@GetMapping("/private")
public String privateApi() {
return "需要登錄的私有接口";
}
}現(xiàn)在我們不管訪問哪一個接口地址,均會跳出一個登陸頁

賬號默認(rèn) user ,密碼由Spring Security 自動幫我們生成,觀察控制臺

? 實現(xiàn)URL身份驗證
通過上述測試要求,目前我們訪問 /public 還是會出現(xiàn)登錄要求,接下來我們創(chuàng)建一個陪你類,以實現(xiàn)這個需求
@Configuration
public class BasicSecurityConfig {
// 配置安全策略
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.
authorizeHttpRequests(authorize -> authorize
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated()
)
.formLogin(withDefaults())
.logout(withDefaults());
return http.build();
}
}現(xiàn)在我們繼續(xù)訪問 /public 發(fā)現(xiàn)已經(jīng)不再需要身份驗證了,可以直接訪問測試

訪問 /private 需要登錄驗證,登陸后即可訪問

上述配置文件中
requestMatchers(“/public/**”).permitAll() 表明放行public訪問路徑下所有接口
formLogin(withDefaults()) 采用默認(rèn)的登錄處理
logout(withDefaults()) 采用默認(rèn)的登出處理
結(jié)語
本章節(jié)主要帶領(lǐng)大家認(rèn)識Spring Security安全框架,并構(gòu)建一個簡單的 Spring Boot + Spring Security 的項目讓大家有一個大致了解。
在接下來的專欄中,我們將逐步深入 Spring Security 的各個技術(shù)細(xì)節(jié),帶你從入門到精通,全面掌握這一安全技術(shù)的方方面面。歡迎繼續(xù)關(guān)注!
下一章節(jié):最新Spring Security實戰(zhàn)教程(二)表單登錄定制到處理邏輯的深度改造
到此這篇關(guān)于最新Spring Security實戰(zhàn)教程之初識Spring Security安全框架的文章就介紹到這了,更多相關(guān)Spring Security安全框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決feign之間文件上傳報錯:Error converting request body
這篇文章主要介紹了解決feign之間文件上傳報錯:Error converting request body的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-05-05
SpringData實現(xiàn)自定義Redis緩存的序列化機制和過期策略
Spring Data Redis緩存通過提供靈活的配置選項,使開發(fā)者能夠根據(jù)業(yè)務(wù)需求自定義序列化方式和過期策略,下面就來具體介紹一下,感興趣的可以了解一下2025-04-04
mybatis-generator 修改表結(jié)構(gòu)后實體不更新問題及解決方法
本文主要介紹了如何在MyBatis Generator中修改表結(jié)構(gòu)后更新實體類的問題,并提供了解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2025-04-04
Java中LinkedHashSet的實現(xiàn)原理詳解
這篇文章主要介紹了Java中LinkedHasSet的實現(xiàn)原理詳解,LinkedHashSet?是具有可預(yù)知迭代順序的?Set?接口的哈希表和鏈接列表實現(xiàn),此實現(xiàn)與HashSet?的不同之處在于,后者維護著一個運行于所有條目的雙重鏈接列表,需要的朋友可以參考下2023-09-09
springboot中JSONObject遍歷并替換部分json值
這篇文章主要介紹了springboot中JSONObject遍歷并替換部分json值,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
SpringBoot?自定義starter?yaml提示失效問題及解決方法
在自定義starter后,必不可少會有properties配置參數(shù)需要指定,而在有時又不知道為什么出現(xiàn)這個問題,這篇文章主要介紹了SpringBoot?自定義starter?yaml提示失效問題,需要的朋友可以參考下2022-12-12

