日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Spring Security概述快速入門

作者:Evan_L 更新時(shí)間: 2024-07-18 編程語(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)鍵詞就是他的特性。

  1. Authentication-認(rèn)證:Spring Security提供通用的登錄認(rèn)證功能,同時(shí)支持Servlet應(yīng)用,也能支持WebFlux這種響應(yīng)式應(yīng)用。
  2. Authorization-授權(quán):Spring Security為授權(quán)提供了全面的支持。同時(shí)支持基于Request的授權(quán)和基于方法的授權(quán)。
  3. 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)有了
欄目分類
最近更新