網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
在深入了解Spring Security的相關(guān)功能之后,一直陷入了深深的糾結(jié)之中:是一片長(zhǎng)文搞定,還是再搞個(gè)專欄。
終于,用上了AI后,不再糾結(jié)怎么排版內(nèi)容了。自此,我也明白了,飯要一口一口吃。
Spring Security概述
官方概述
Spring Security是一款提供認(rèn)證、授權(quán)、以及針對(duì)常見(jiàn)(網(wǎng)絡(luò))攻擊的防御的框架。它為保護(hù)命令式和反應(yīng)式應(yīng)用程序提供了一流的支持,是保護(hù)基于Spring的應(yīng)用程序的事實(shí)標(biāo)準(zhǔn)。
- 從官方的介紹,我們可以看到他就是為基于Spring的應(yīng)用量身定制的。這也是為什么我們?nèi)绻褂肧pring MVC/Spring Boot繼承Spring Security如此絲滑的原因。
- 三個(gè)關(guān)鍵詞:認(rèn)證、授權(quán)、以及針對(duì)常見(jiàn)(網(wǎng)絡(luò))攻擊的防御
記住著三個(gè)關(guān)鍵詞,因?yàn)樗苯哟碇鳶pring Security提供的三大核心功能/特性。
Why Spring Security
Spring Security的特性
Spring Security的三個(gè)關(guān)鍵詞就是他的特性。
- Authentication-認(rèn)證:Spring Security提供通用的登錄認(rèn)證功能,同時(shí)支持Servlet應(yīng)用,也能支持WebFlux這種響應(yīng)式應(yīng)用。
- Authorization-授權(quán):Spring Security為授權(quán)提供了全面的支持。同時(shí)支持基于Request的授權(quán)和基于方法的授權(quán)。
- Protection Against Exploits-防范漏洞:結(jié)合常見(jiàn)的防范手段,提供支持:
- Cross Site Request Forgery:跨域請(qǐng)求偽造
- Response Header:提供通用的響應(yīng)頭設(shè)置,為功能性、常見(jiàn)的網(wǎng)絡(luò)安全響應(yīng)頭提供支持,同時(shí)設(shè)置默認(rèn)的請(qǐng)求頭。
- Request Header: 通過(guò)請(qǐng)求頭可將http請(qǐng)求強(qiáng)制使用https.
要回答這個(gè)問(wèn)題,就不得不對(duì)比一下另一款流行的安全框架:Shiro
框架的使用層面
Spring Security | Shiro | |
---|---|---|
集成難易度 | 與Spring框架無(wú)縫集成,可以很方便地與其他Spring組件一起使用 | 需要與Spring進(jìn)行整合開發(fā),但配置和使用都比較簡(jiǎn)單 |
活躍度和資源 | 龐大的社區(qū)資源和文檔支持,有大量使用案例和文檔可供參考 | 活躍的社區(qū),為開發(fā)者提供交流和幫助平臺(tái) |
依賴性 | 依賴于Spring容器 | 不依賴于任何框架或容器,可以獨(dú)立運(yùn)行 |
使用復(fù)雜度 | 功能豐富,使用起來(lái)可能稍微復(fù)雜一些 | API設(shè)計(jì)簡(jiǎn)潔,易于理解和使用 |
定制性 | 支持自定義安全注解和編程式訪問(wèn)控制,可根據(jù)項(xiàng)目需求進(jìn)行定制化開發(fā) | 提供簡(jiǎn)潔的API和高度靈活性,可根據(jù)項(xiàng)目需求進(jìn)行定制化開發(fā) |
性能 | 性能表現(xiàn)良好,具體性能因使用場(chǎng)景而異 | 在緩存等方面可能具有更好的性能表現(xiàn) |
功能對(duì)比層面
功能 | Spring Security | Shiro |
---|---|---|
身份認(rèn)證 | 支持多種身份認(rèn)證機(jī)制,包括基于表單、HTTP Basic和HTTP Digest等 | 提供多種身份認(rèn)證機(jī)制,包括基于表單、HTTP Basic和HTTP Digest等 |
授權(quán) | 支持注解和配置文件定義訪問(wèn)控制策略,支持基于表達(dá)式的訪問(wèn)控制 | 提供豐富的授權(quán)功能,可以使用注解或配置文件定義訪問(wèn)控制策略 |
會(huì)話管理 | 支持會(huì)話管理功能,包括跨站點(diǎn)請(qǐng)求偽造(CSRF)保護(hù)和會(huì)話失效時(shí)間設(shè)置等 | 提供會(huì)話管理功能,但需要開發(fā)者自行實(shí)現(xiàn)跨站點(diǎn)請(qǐng)求偽造(CSRF)保護(hù)等安全特性 |
異常處理 | 提供內(nèi)置的異常處理機(jī)制。提供跳轉(zhuǎn)到登錄前的請(qǐng)求,也可配置跳轉(zhuǎn)到指定頁(yè)面 | 提供內(nèi)置的異常處理機(jī)制。定制登錄成功后的跳轉(zhuǎn)請(qǐng)求提供一定的支持,但需要自行實(shí)現(xiàn)完整功能 |
RememberMe功能 | 支持RememberMe功能,可以輕松實(shí)現(xiàn)用戶自動(dòng)登錄 | 提供RememberMe功能,可以輕松實(shí)現(xiàn)用戶自動(dòng)登錄 |
豐富的安全特性 | 提供了多層安全防護(hù),包括認(rèn)證、授權(quán)、加密等,可以有效保護(hù)Web應(yīng)用程序的安全。還提供了防止跨站腳本攻擊(XSS)、跨站請(qǐng)求偽造(CSRF)等安全特性。 | 提供了身份驗(yàn)證、授權(quán)、加密和會(huì)話管理等安全功能,但可能沒(méi)有Spring Security那么豐富的安全特性。 |
概括來(lái)說(shuō)就是:
Spring Security的提供了很多豐富的安全特性,這點(diǎn)除了在上述的功能對(duì)比上體現(xiàn),也體現(xiàn)在三大關(guān)鍵詞之一的:應(yīng)對(duì)常見(jiàn)攻擊的防御上。同時(shí),可以無(wú)縫繼承到Spring的應(yīng)用。
而Shiro主要突出一個(gè)短小精干,雖然沒(méi)有Spring Security的安全特性,但是登錄認(rèn)證、授權(quán)都支持。而且使用更加簡(jiǎn)單、也更容易上手,他甚至做到可以基于配置文件進(jìn)行配置,這是Spring Security無(wú)法做到的。
小結(jié)
綜上所述,選擇哪一個(gè)框架需要根據(jù)你的項(xiàng)目需求來(lái)決定。
- 如果你希望擁有一個(gè)提供多種開箱即用的安全特性的強(qiáng)大的安全框架,又或者希望能夠快速與Spring進(jìn)行集成的安全框架,那么Spring Security是你的不二選擇。
- 如果你需要一個(gè)輕量級(jí)、簡(jiǎn)單易用、易上手的安全框架,或者不依賴于特定框架或容器,那么Shiro可能更適合你。
Quick Start
官方也提供了一些Demo,最簡(jiǎn)單的是spring-security-samples里面的/servlet/spring-boot/java/hello-security-explicit
從構(gòu)建的角度簡(jiǎn)單給大家說(shuō)說(shuō)
引入maven依賴
由于個(gè)人用慣了maven,就不說(shuō)gradle哈。
<properties>
<!-- spring boot 3.x版本需要Java 17才能運(yùn)行 -->
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>3.1.6</spring-boot.version>
</properties>
<!-- 指定springboot版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 引入Spring Security的starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- 引入Spring Web的starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 引入視圖模板引擎的starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
配置過(guò)濾器鏈條
這里就直接拿過(guò)來(lái)了
package example;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;
/**
* @EnableWebSecurity:開啟Spring Secuirty
*
* @author Rob Winch
*/
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// 這里配置的每一個(gè)http的方法,都在配置一個(gè)過(guò)濾器
// @formatter:off
http
// 引入AuthorizationFilter
.authorizeHttpRequests((authorize) -> authorize
.anyRequest().authenticated()
)
// 引入BasicAuthenticationFilter,意味著支持基于Basic進(jìn)行認(rèn)證
.httpBasic(withDefaults())
// 引入U(xiǎn)sernamePasswordAuthenticationFilter
.formLogin(withDefaults());
// @formatter:on
// 構(gòu)建安全過(guò)濾器鏈
return http.build();
}
// @formatter:off
@Bean
public InMemoryUserDetailsManager userDetailsService() {
// 為了簡(jiǎn)單演示,提供基于內(nèi)存的用戶信息
// 生成的用戶密碼使用bcrypt進(jìn)行加密存儲(chǔ)
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
// 這個(gè)家伙實(shí)現(xiàn)了UserDetailsService
return new InMemoryUserDetailsManager(user);
}
// @formatter:on
}
這樣,我們就搭建好了第一個(gè)簡(jiǎn)單的Spring Security工程。
在瀏覽器,輸入:http://localhost:8080/login,就進(jìn)入登錄頁(yè)面了。
然后,輸入我們配置的用戶名:user,密碼:password,點(diǎn)擊登錄就進(jìn)入首頁(yè)了。
后記
本節(jié)最重要的內(nèi)容是介紹Spring Security。如果你搞明白了什么場(chǎng)景需要選擇他,那么你就掌握這節(jié)的重點(diǎn)內(nèi)容。
請(qǐng)給文章點(diǎn)個(gè)贊,也給你自己點(diǎn)個(gè)贊。下一節(jié),我們將聊聊關(guān)于授權(quán)和認(rèn)證的相關(guān)概念.
原文鏈接:https://blog.csdn.net/Evan_L/article/details/136605426
- 上一篇:沒(méi)有了
- 下一篇:沒(méi)有了
相關(guān)推薦
- 2022-04-03 Flutter實(shí)現(xiàn)旋轉(zhuǎn)掃描效果_Android
- 2022-09-22 uni ui 、color ui 圖標(biāo)icon的使用
- 2022-06-18 C#如何在窗體程序中操作數(shù)據(jù)庫(kù)數(shù)據(jù)_C#教程
- 2022-05-12 寶塔面板配置SSL證書
- 2022-09-17 Pandas中df.loc[]與df.iloc[]的用法與異同?_python
- 2022-06-26 shell腳本語(yǔ)言之if條件判斷語(yǔ)句實(shí)例詳解_linux shell
- 2022-07-06 python繪制子圖技巧之plt.subplot、plt.subplots及坐標(biāo)軸修改_python
- 2022-11-03 python回歸分析邏輯斯蒂模型之多分類任務(wù)詳解_python
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支