最新Spring Security實(shí)戰(zhàn)教程之Spring Security安全框架指南
前言
隨著Web應(yīng)用和微服務(wù)架構(gòu)的普及,作為JAVA開(kāi)發(fā)者如何保證系統(tǒng)免受各種安全威脅(如未經(jīng)授權(quán)的訪問(wèn)、數(shù)據(jù)泄露、跨站請(qǐng)求偽造等)成為一個(gè)我們必須要解決的問(wèn)題。
Spring Security
作為Spring
生態(tài)系統(tǒng)中的核心組件,通過(guò)提供認(rèn)證(Authentication
)與授權(quán)(Authorization
)和針對(duì)常見(jiàn)攻擊等一系列安全功能,為開(kāi)發(fā)者構(gòu)建安全穩(wěn)定的應(yīng)用提供了強(qiáng)有力的支持。
什么是Spring Security?
官方文檔:https://docs.spring.io/spring-security/reference/index.html
Spring Security
是一個(gè)基于Spring
框架的強(qiáng)大安全解決方案,它為應(yīng)用提供了一整套安全服務(wù),主要包括以下幾個(gè)方面:
- 認(rèn)證(Authentication): 確定訪問(wèn)者身份的過(guò)程。Spring Security通過(guò)多種方式(如表單登錄、Basic認(rèn)證、OAuth2等)實(shí)現(xiàn)用戶身份驗(yàn)證。
- 授權(quán)(Authorization): 根據(jù)用戶身份和權(quán)限確定資源訪問(wèn)級(jí)別。開(kāi)發(fā)者可以通過(guò)配置或注解的方式,靈活地控制不同用戶對(duì)不同資源的訪問(wèn)權(quán)限。
- 防護(hù)機(jī)制: 包括防止跨站請(qǐng)求偽造(CSRF)、點(diǎn)擊劫持等攻擊手段,保障應(yīng)用在網(wǎng)絡(luò)攻擊面前的穩(wěn)定性。
這種以攔截器和過(guò)濾器鏈為核心的設(shè)計(jì),使得Spring Security能夠在請(qǐng)求到達(dá)業(yè)務(wù)邏輯之前,先進(jìn)行安全檢查,從而構(gòu)建出一層堅(jiān)固的防護(hù)屏障。
同類(lèi)框架對(duì)比
說(shuō)到安全框架,我們就不得不提另外一個(gè)輕量級(jí)的安全管理框架 Apache Shiro
,它有三個(gè)核心組件:Subject
, SecurityManager
和 Realms
, Shiro 的相關(guān)內(nèi)容大家可以自行學(xué)習(xí),這里不做過(guò)多介紹了
下面博主總結(jié)兩個(gè)框架的一些對(duì)比:
特性 | Spring Security | Apache Shiro |
---|---|---|
學(xué)習(xí)曲線 | 較陡峭 | 易上手 |
功能完整性 | ★★★★★ | ★★★☆☆ |
Spring生態(tài)集成 | 原生支持 | 需要適配 |
微服務(wù)支持 | OAuth2/JWT | 需自行擴(kuò)展 |
社區(qū)活躍度 | 極高 | 一般 |
通過(guò)上述的對(duì)比圖,可以總結(jié)出:
- Spring Security是一個(gè)重量級(jí)的安全管理框架;Shiro則是一個(gè)輕量級(jí)的安全管理框架
- Spring Security 上手稍有難度,Shiro 的配置和使用比較簡(jiǎn)單
- Shiro 依賴性低,不需要任何框架和容器,可以獨(dú)立運(yùn)行
- 如果你的項(xiàng)目基于Spring容器,那么優(yōu)先推薦Spring Security
Spring Security典型應(yīng)用場(chǎng)景
傳統(tǒng)Web應(yīng)用安全
通過(guò)配置實(shí)現(xiàn)URL級(jí)權(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令牌自動(dòng)校驗(yàn)
- 無(wú)狀態(tài)會(huì)話管理
- 跨域安全配置(CORS)
微服務(wù)安全網(wǎng)關(guān)
資源服務(wù)器配置示例
spring: security: oauth2: resourceserver: jwt: issuer-uri: http://auth-server:9000
快速搭建安全環(huán)境
以博主本機(jī)環(huán)境為例
JDK 17+
Spring Boot 3.4.3
Maven 3.9+
IDE(IntelliJ IDEA或VS Code)
為了方便大家學(xué)習(xí)給大家提供一個(gè)官方代碼案例地址:
https://github.com/spring-projects/spring-security-samples/tree/main
? 創(chuàng)建Spring Boot項(xiàng)目
使用 start.spring.io 生成項(xiàng)目,勾選以下依賴:
<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>
? 測(cè)試安全訪問(wèn)
創(chuàng)建測(cè)試控制器,我們希望訪問(wèn) /public
無(wú)需驗(yàn)證身份,訪問(wèn) /private
需要用戶登錄
@RestController public class DemoController { @GetMapping("/public") public String publicApi() { return "無(wú)需認(rèn)證的公開(kāi)接口"; } @GetMapping("/private") public String privateApi() { return "需要登錄的私有接口"; } }
現(xiàn)在我們不管訪問(wèn)哪一個(gè)接口地址,均會(huì)跳出一個(gè)登陸頁(yè)
賬號(hào)默認(rèn) user
,密碼由Spring Security
自動(dòng)幫我們生成,觀察控制臺(tái)
? 實(shí)現(xiàn)URL身份驗(yàn)證
通過(guò)上述測(cè)試要求,目前我們?cè)L問(wèn) /public
還是會(huì)出現(xiàn)登錄要求,接下來(lái)我們創(chuàng)建一個(gè)陪你類(lèi),以實(shí)現(xiàn)這個(gè)需求
@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ù)訪問(wèn) /public
發(fā)現(xiàn)已經(jīng)不再需要身份驗(yàn)證了,可以直接訪問(wèn)測(cè)試
訪問(wèn) /private
需要登錄驗(yàn)證,登陸后即可訪問(wèn)
上述配置文件中
requestMatchers(“/public/**”).permitAll() 表明放行public訪問(wèn)路徑下所有接口
formLogin(withDefaults()) 采用默認(rèn)的登錄處理
logout(withDefaults()) 采用默認(rèn)的登出處理
結(jié)語(yǔ)
本章節(jié)主要帶領(lǐng)大家認(rèn)識(shí)Spring Security安全框架,并構(gòu)建一個(gè)簡(jiǎn)單的 Spring Boot + Spring Security
的項(xiàng)目讓大家有一個(gè)大致了解。
在接下來(lái)的專(zhuān)欄中,我們將逐步深入 Spring Security
的各個(gè)技術(shù)細(xì)節(jié),帶你從入門(mén)到精通,全面掌握這一安全技術(shù)的方方面面。歡迎繼續(xù)關(guān)注!
下一章節(jié):最新Spring Security實(shí)戰(zhàn)教程(二)表單登錄定制到處理邏輯的深度改造
到此這篇關(guān)于最新Spring Security實(shí)戰(zhàn)教程之初識(shí)Spring Security安全框架的文章就介紹到這了,更多相關(guān)Spring Security安全框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot Activemq整合過(guò)程代碼圖解
這篇文章主要介紹了Springboot Activemq整合過(guò)程代碼圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02SpringBoot實(shí)現(xiàn)向量數(shù)據(jù)庫(kù)優(yōu)化檢索的方案及示例
在Spring?Boot中實(shí)現(xiàn)RAG(Retrieval-Augmented?Generation)的增強(qiáng),可以從檢索優(yōu)化、生成優(yōu)化和系統(tǒng)架構(gòu)三個(gè)維度進(jìn)行改進(jìn),本文給大家介紹了具體實(shí)現(xiàn)方案及示例,需要的朋友可以參考下2025-02-02MyBatisPlus?大數(shù)據(jù)量查詢慢的問(wèn)題解決
本文主要介紹了MyBatis?Plus?解決大數(shù)據(jù)量查詢慢問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02EventBus與Spring Event區(qū)別詳解(EventBus 事件機(jī)制,Spring Event事件機(jī)制)
這篇文章主要介紹了EventBus與Spring Event區(qū)別,需要的朋友可以參考下2020-02-02