網站首頁 編程語言 正文
前言
在深入了解Spring Security的相關功能之后,一直陷入了深深的糾結之中:是一片長文搞定,還是再搞個專欄。
終于,用上了AI后,不再糾結怎么排版內容了。自此,我也明白了,飯要一口一口吃。
Spring Security概述
官方概述
Spring Security是一款提供認證、授權、以及針對常見(網絡)攻擊的防御的框架。它為保護命令式和反應式應用程序提供了一流的支持,是保護基于Spring的應用程序的事實標準。
- 從官方的介紹,我們可以看到他就是為基于Spring的應用量身定制的。這也是為什么我們如果使用Spring MVC/Spring Boot繼承Spring Security如此絲滑的原因。
- 三個關鍵詞:認證、授權、以及針對常見(網絡)攻擊的防御
記住著三個關鍵詞,因為他直接代表著Spring Security提供的三大核心功能/特性。
Why Spring Security
Spring Security的特性
Spring Security的三個關鍵詞就是他的特性。
- Authentication-認證:Spring Security提供通用的登錄認證功能,同時支持Servlet應用,也能支持WebFlux這種響應式應用。
- Authorization-授權:Spring Security為授權提供了全面的支持。同時支持基于Request的授權和基于方法的授權。
- Protection Against Exploits-防范漏洞:結合常見的防范手段,提供支持:
- Cross Site Request Forgery:跨域請求偽造
- Response Header:提供通用的響應頭設置,為功能性、常見的網絡安全響應頭提供支持,同時設置默認的請求頭。
- Request Header: 通過請求頭可將http請求強制使用https.
要回答這個問題,就不得不對比一下另一款流行的安全框架:Shiro
框架的使用層面
Spring Security | Shiro | |
---|---|---|
集成難易度 | 與Spring框架無縫集成,可以很方便地與其他Spring組件一起使用 | 需要與Spring進行整合開發,但配置和使用都比較簡單 |
活躍度和資源 | 龐大的社區資源和文檔支持,有大量使用案例和文檔可供參考 | 活躍的社區,為開發者提供交流和幫助平臺 |
依賴性 | 依賴于Spring容器 | 不依賴于任何框架或容器,可以獨立運行 |
使用復雜度 | 功能豐富,使用起來可能稍微復雜一些 | API設計簡潔,易于理解和使用 |
定制性 | 支持自定義安全注解和編程式訪問控制,可根據項目需求進行定制化開發 | 提供簡潔的API和高度靈活性,可根據項目需求進行定制化開發 |
性能 | 性能表現良好,具體性能因使用場景而異 | 在緩存等方面可能具有更好的性能表現 |
功能對比層面
功能 | Spring Security | Shiro |
---|---|---|
身份認證 | 支持多種身份認證機制,包括基于表單、HTTP Basic和HTTP Digest等 | 提供多種身份認證機制,包括基于表單、HTTP Basic和HTTP Digest等 |
授權 | 支持注解和配置文件定義訪問控制策略,支持基于表達式的訪問控制 | 提供豐富的授權功能,可以使用注解或配置文件定義訪問控制策略 |
會話管理 | 支持會話管理功能,包括跨站點請求偽造(CSRF)保護和會話失效時間設置等 | 提供會話管理功能,但需要開發者自行實現跨站點請求偽造(CSRF)保護等安全特性 |
異常處理 | 提供內置的異常處理機制。提供跳轉到登錄前的請求,也可配置跳轉到指定頁面 | 提供內置的異常處理機制。定制登錄成功后的跳轉請求提供一定的支持,但需要自行實現完整功能 |
RememberMe功能 | 支持RememberMe功能,可以輕松實現用戶自動登錄 | 提供RememberMe功能,可以輕松實現用戶自動登錄 |
豐富的安全特性 | 提供了多層安全防護,包括認證、授權、加密等,可以有效保護Web應用程序的安全。還提供了防止跨站腳本攻擊(XSS)、跨站請求偽造(CSRF)等安全特性。 | 提供了身份驗證、授權、加密和會話管理等安全功能,但可能沒有Spring Security那么豐富的安全特性。 |
概括來說就是:
Spring Security的提供了很多豐富的安全特性,這點除了在上述的功能對比上體現,也體現在三大關鍵詞之一的:應對常見攻擊的防御上。同時,可以無縫繼承到Spring的應用。
而Shiro主要突出一個短小精干,雖然沒有Spring Security的安全特性,但是登錄認證、授權都支持。而且使用更加簡單、也更容易上手,他甚至做到可以基于配置文件進行配置,這是Spring Security無法做到的。
小結
綜上所述,選擇哪一個框架需要根據你的項目需求來決定。
- 如果你希望擁有一個提供多種開箱即用的安全特性的強大的安全框架,又或者希望能夠快速與Spring進行集成的安全框架,那么Spring Security是你的不二選擇。
- 如果你需要一個輕量級、簡單易用、易上手的安全框架,或者不依賴于特定框架或容器,那么Shiro可能更適合你。
Quick Start
官方也提供了一些Demo,最簡單的是spring-security-samples里面的/servlet/spring-boot/java/hello-security-explicit
從構建的角度簡單給大家說說
引入maven依賴
由于個人用慣了maven,就不說gradle哈。
<properties>
<!-- spring boot 3.x版本需要Java 17才能運行 -->
<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>
配置過濾器鏈條
這里就直接拿過來了
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 {
// 這里配置的每一個http的方法,都在配置一個過濾器
// @formatter:off
http
// 引入AuthorizationFilter
.authorizeHttpRequests((authorize) -> authorize
.anyRequest().authenticated()
)
// 引入BasicAuthenticationFilter,意味著支持基于Basic進行認證
.httpBasic(withDefaults())
// 引入UsernamePasswordAuthenticationFilter
.formLogin(withDefaults());
// @formatter:on
// 構建安全過濾器鏈
return http.build();
}
// @formatter:off
@Bean
public InMemoryUserDetailsManager userDetailsService() {
// 為了簡單演示,提供基于內存的用戶信息
// 生成的用戶密碼使用bcrypt進行加密存儲
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
// 這個家伙實現了UserDetailsService
return new InMemoryUserDetailsManager(user);
}
// @formatter:on
}
這樣,我們就搭建好了第一個簡單的Spring Security工程。
在瀏覽器,輸入:http://localhost:8080/login,就進入登錄頁面了。
然后,輸入我們配置的用戶名:user,密碼:password,點擊登錄就進入首頁了。
后記
本節最重要的內容是介紹Spring Security。如果你搞明白了什么場景需要選擇他,那么你就掌握這節的重點內容。
請給文章點個贊,也給你自己點個贊。下一節,我們將聊聊關于授權和認證的相關概念.
原文鏈接:https://blog.csdn.net/Evan_L/article/details/136605426
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-06-02 Go語言的變量定義詳情_Golang
- 2022-09-13 iOS開發之UIMenuController使用示例詳解_IOS
- 2022-11-05 Android開發RecyclerView實現折線圖效果_Android
- 2023-06-20 C++模擬實現vector示例代碼圖文講解_C 語言
- 2022-07-21 nginx?配置指令之location使用詳解_nginx
- 2022-12-21 Android?RecyclerView四級緩存源碼層詳細分析_Android
- 2022-07-08 Python3?Loguru輸出日志工具的使用_python
- 2022-04-19 Install MongoDB Community Edition on Red Hat or Ce
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支