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

學無先后,達者為師

網站首頁 編程語言 正文

Spring Security概述快速入門

作者:Evan_L 更新時間: 2024-07-18 編程語言

前言

在深入了解Spring Security的相關功能之后,一直陷入了深深的糾結之中:是一片長文搞定,還是再搞個專欄。
終于,用上了AI后,不再糾結怎么排版內容了。自此,我也明白了,飯要一口一口吃。

Spring Security概述

官方概述

Spring Security是一款提供認證、授權、以及針對常見(網絡)攻擊的防御的框架。它為保護命令式和反應式應用程序提供了一流的支持,是保護基于Spring的應用程序的事實標準。

  • 從官方的介紹,我們可以看到他就是為基于Spring的應用量身定制的。這也是為什么我們如果使用Spring MVC/Spring Boot繼承Spring Security如此絲滑的原因。
  • 三個關鍵詞:認證授權、以及針對常見(網絡)攻擊的防御

記住著三個關鍵詞,因為他直接代表著Spring Security提供的三大核心功能/特性。

Why Spring Security

Spring Security的特性

Spring Security的三個關鍵詞就是他的特性。

  1. Authentication-認證:Spring Security提供通用的登錄認證功能,同時支持Servlet應用,也能支持WebFlux這種響應式應用。
  2. Authorization-授權:Spring Security為授權提供了全面的支持。同時支持基于Request的授權和基于方法的授權。
  3. 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

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新