最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Security6.3.x的使用指南與注意事項

 更新時間:2025年08月04日 17:01:44   作者:墨鴉_Cormorant  
Spring?Security?6.3.1基于現(xiàn)代化架構(gòu),提供簡潔配置、增強默認安全性和OAuth2.1/OIDC支持,采用LambdaDSL和組件化設(shè)計,涵蓋用戶認證、方法級權(quán)限控制及資源服務(wù)器配置,強調(diào)PasswordEncoder、HTTPS、CSRF保護等最佳實踐,下面是Spring?Security?6.3.1?的使用指南,一起學(xué)習(xí)吧

介紹

Spring Security 6.3.1 是一個重要的版本更新,它建立在 Spring Security 6 的核心現(xiàn)代化架構(gòu)之上,提供了更簡潔的配置、更好的默認安全性以及對最新安全標準的支持。以下是一個 Spring Security 6.3.1 的使用指南,涵蓋核心概念、配置和常見任務(wù):

核心理念:

  • Lambda DSL (推薦): Spring Security 6 開始大力推廣基于 Lambda 的 DSL (領(lǐng)域特定語言) 配置方式,它更簡潔、類型安全,并且避免了鏈式調(diào)用 .and() 的繁瑣。這是當前推薦的配置方式
  • 組件化: 安全配置被分解為更小、更專注的組件 (SecurityFilterChain, UserDetailsService, PasswordEncoder, AuthenticationProvider 等),提高了靈活性和可測試性。
  • 默認安全性增強: 默認配置提供了更強的安全防護(例如,默認啟用 CSRF 保護,更安全的會話管理)。
  • Servlet 和 Reactive 分離: API 清晰區(qū)分了 Servlet (傳統(tǒng) Web) 和 Reactive (響應(yīng)式 WebFlux) 應(yīng)用的支持。
  • OAuth2 和 OIDC 現(xiàn)代化: 對 OAuth 2.1 和 OpenID Connect 1.0 提供了更現(xiàn)代、更符合規(guī)范的支持。

基礎(chǔ)配置 (Servlet 應(yīng)用 - 使用 Lambda DSL)

添加依賴 (Maven):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>3.2.0</version> <!-- Spring Boot 3.2.x 通常包含 Spring Security 6.3.x -->
</dependency>

核心配置類 (SecurityConfig)

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.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity // 啟用 Spring Security Web 支持
public class SecurityConfig {
    // 核心配置:定義安全過濾器鏈 (SecurityFilterChain)
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            // 授權(quán)配置 (核心)
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/", "/home", "/public/**", "/css/**", "/js/**", "/images/**").permitAll() // 允許所有人訪問
                .requestMatchers("/user/**").hasRole("USER") // 需要 USER 角色
                .requestMatchers("/admin/**").hasRole("ADMIN") // 需要 ADMIN 角色
                .anyRequest().authenticated() // 其他所有請求都需要認證
            )
            // 表單登錄配置
            .formLogin(formLogin -> formLogin
                //.loginPage("/login") // 自定義登錄頁路徑。不指定則使用默認登錄頁
                .permitAll() // 允許所有人訪問登錄頁
                .defaultSuccessUrl("/dashboard") // 登錄成功后的默認跳轉(zhuǎn)頁
            )
            // 退出登錄配置
            .logout(logout -> logout
                .logoutUrl("/logout") // 退出登錄的 URL (默認也是 /logout)
                .logoutSuccessUrl("/login?logout") // 退出成功后的跳轉(zhuǎn)頁
                .permitAll()
            )
            // 異常處理 (如訪問拒絕)
            .exceptionHandling(exceptionHandling -> exceptionHandling
                .accessDeniedPage("/access-denied") // 自定義訪問拒絕頁
            )
            // 啟用 HTTP Basic 認證 (可選,常用于 API)
            //.httpBasic(Customizer.withDefaults())
            // 啟用 CSRF 保護 (默認啟用,對于 API 可能需要禁用)
            //.csrf(csrf -> csrf.disable()); // 謹慎禁用!
        return http.build();
    }
    // 配置內(nèi)存用戶存儲 (僅用于演示/測試,生產(chǎn)環(huán)境用數(shù)據(jù)庫)
    @Bean
    public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
        UserDetails user = User.builder()
            .username("user")
            .password(passwordEncoder.encode("password")) // 必須加密!
            .roles("USER")
            .build();
        UserDetails admin = User.builder()
            .username("admin")
            .password(passwordEncoder.encode("adminpass"))
            .roles("USER", "ADMIN")
            .build();
        return new InMemoryUserDetailsManager(user, admin);
    }
    // 配置密碼編碼器 (強制要求,不能使用明文!)
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(); // 推薦 BCrypt
        // 其他選項: Pbkdf2PasswordEncoder, SCryptPasswordEncoder, Argon2PasswordEncoder, DelegatingPasswordEncoder
    }
}

關(guān)鍵配置詳解(Lambda DSL)

  • authorizeHttpRequests(authorize -> authorize ...): 定義 URL 的訪問規(guī)則。
    • .requestMatchers(...).permitAll(): 匹配指定路徑模式,允許所有訪問(包括匿名)。
    • .requestMatchers(...).hasRole("ROLE") / .hasAuthority("AUTHORITY"): 匹配路徑,要求用戶擁有指定角色或權(quán)限。注意 hasRole 會自動添加 ROLE_ 前綴,所以配置里寫 USER 對應(yīng)數(shù)據(jù)庫/用戶詳情中的 ROLE_USER。hasAuthority 則要求完全匹配字符串。
    • .anyRequest().authenticated(): 匹配所有未在前面規(guī)則中匹配的請求,要求用戶已認證(登錄)。
    • .anyRequest().denyAll(): 匹配所有未在前面規(guī)則中匹配的請求,拒絕所有訪問。
  • formLogin(formLogin -> formLogin ...): 配置基于表單的登錄。
    • .loginPage("/login"): 指定自定義登錄頁面的 URL。不指定則使用Spring Security 默認提供一個簡單登錄頁。
    • .loginProcessingUrl("/login"): 指定處理登錄表單提交的 URL(通常與登錄頁表單的 action 一致)。
    • .defaultSuccessUrl("/dashboard", true): 登錄成功后重定向的 URL。第二個參數(shù) true 表示總是重定向到此 URL,忽略登錄前訪問的受保護頁面。
    • .usernameParameter("username") / .passwordParameter("password"): 自定義表單中用戶名和密碼字段的名稱。
    • .failureUrl("/login?error"): 登錄失敗后重定向的 URL。
    • .permitAll(): 允許所有人訪問登錄相關(guān)的端點。
    • 默認登錄頁的注意事項
  • 自動生成位置
    • 當訪問受保護資源時,會自動重定向到 /login
    • 無需創(chuàng)建控制器或視圖,Spring Security 自動處理
  • 樣式限制
    • 默認頁面樣式非?;A(chǔ)(無 CSS)
    • 不適合生產(chǎn)環(huán)境,建議用于原型開發(fā)或內(nèi)部工具
  • 功能包含
    • 包含 CSRF 令牌(默認啟用)
    • 顯示錯誤消息(認證失敗時)
    • 提供 “Remember me” 選項(需額外啟用)
  • 啟用 “Remember me”
.rememberMe(remember -> remember
    .key("uniqueAndSecretKey")
    .tokenValiditySeconds(86400) // 1天
)
  • logout(logout -> logout ...): 配置退出登錄。
    • .logoutUrl("/logout"): 觸發(fā)退出登錄的 URL (默認是 /logout)。
    • .logoutSuccessUrl("/login?logout"): 退出成功后的重定向 URL。
    • .invalidateHttpSession(true): 是否使 HTTP Session 失效 (默認 true)。
    • .deleteCookies("JSESSIONID"): 指定退出時要刪除的 Cookie 名稱。
    • .permitAll(): 允許所有人訪問退出端點 (通常不需要認證即可退出)。
  • exceptionHandling(exceptionHandling -> exceptionHandling ...): 處理安全異常。
    • .accessDeniedPage("/access-denied"): 當已認證用戶訪問其沒有權(quán)限的資源時,重定向到指定頁面。
    • .accessDeniedHandler(accessDeniedHandler): 使用自定義的 AccessDeniedHandler 處理訪問拒絕。
    • .authenticationEntryPoint(authenticationEntryPoint): 當未認證用戶嘗試訪問受保護資源時,使用自定義的 AuthenticationEntryPoint 處理 (如重定向到登錄頁或返回 401)。
  • httpBasic(Customizer.withDefaults()): 啟用 HTTP Basic 認證。常用于 API。
  • csrf(csrf -> csrf.disable()): 謹慎使用! 禁用 CSRF 保護。通常只在創(chuàng)建無狀態(tài) API (如 JWT) 時禁用。對于有 Session 的 Web 應(yīng)用,強烈建議保持啟用。

用戶認證 (進階)

  • UserDetailsService: 核心接口,用于根據(jù)用戶名加載用戶信息 (UserDetails)。你需要實現(xiàn)它來定義如何從你的數(shù)據(jù)源(數(shù)據(jù)庫、LDAP、外部服務(wù)等)加載用戶。
@Service
public class JpaUserDetailsService implements UserDetailsService {
    private final UserRepository userRepository;
    public JpaUserDetailsService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return userRepository.findByUsername(username)
                .map(SecurityUser::new) // 將你的領(lǐng)域用戶轉(zhuǎn)換為 UserDetails
                .orElseThrow(() -> new UsernameNotFoundException("User not found: " + username));
    }
}
  • 確保你的 SecurityUser 類實現(xiàn)了 UserDetails 接口,或直接使用 Spring Security 的 User 類(或其構(gòu)建器)來包裝你的領(lǐng)域用戶信息(用戶名、密碼、權(quán)限集合、是否啟用/過期/鎖定等)。
  • PasswordEncoder: 必須使用。負責密碼的加密存儲和驗證。推薦 BCryptPasswordEncoder。
@Bean
public PasswordEncoder passwordEncoder() {
    return PasswordEncoderFactories.createDelegatingPasswordEncoder(); // 推薦:支持多種編碼,默認 BCrypt
    // 或 return new BCryptPasswordEncoder();
}
  • AuthenticationProvider(可選): 如果你想自定義認證邏輯(例如,除了用戶名密碼還驗證其他信息),可以實現(xiàn) AuthenticationProvider 接口并注冊它。通常 DaoAuthenticationProvider (使用 UserDetailsServicePasswordEncoder) 已足夠。

方法級安全(Method Security)

  • 啟用: 在配置類上添加 @EnableMethodSecurity
@Configuration
@EnableMethodSecurity
public class MethodSecurityConfig {
    // ...
}
  • 使用注解:
    • @PreAuthorize("hasRole('ADMIN')") / @PreAuthorize("hasAuthority('DELETE_USER')"): 在方法執(zhí)行前進行權(quán)限檢查。支持 SpEL 表達式,非常靈活。
    • @PostAuthorize: 在方法執(zhí)行后進行權(quán)限檢查(例如,檢查返回值)。
    • @Secured("ROLE_ADMIN"): 較舊的注解,只支持簡單的角色列表,功能不如 @PreAuthorize 強大。
    • @RolesAllowed("USER"): JSR-250 標準注解,類似于 @Secured。
@Service
public class UserService {
    @PreAuthorize("hasRole('ADMIN') or #id == authentication.principal.id") // SpEL 示例:允許管理員或用戶自己訪問
    public User getUserById(Long id) {
        // ...
    }
    @PreAuthorize("hasAuthority('USER_DELETE')")
    public void deleteUser(Long id) {
        // ...
    }
}

OAuth2 / OIDC 資源服務(wù)器(保護 API)

Spring Security 6 對 OAuth2 資源服務(wù)器的配置進行了顯著簡化。

  • 添加依賴:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
  • 配置 JWT 解碼器 (最常見):application.properties/application.yml 中配置頒發(fā)者 URI (issuer-uri) 或 JWK Set URI (jwk-set-uri)。Spring Boot 會自動配置 JwtDecoder
spring.security.oauth2.resourceserver.jwt.issuer-uri=https://your-auth-server.com/realms/your-realm
# 或者
# spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://your-auth-server.com/jwks
  • 配置資源服務(wù)器安全過濾器鏈:
@Bean
SecurityFilterChain resourceServerSecurityFilterChain(HttpSecurity http) throws Exception {
    http
        .securityMatcher("/api/**") // 只對 /api/** 路徑應(yīng)用此安全配置
        .authorizeHttpRequests(authorize -> authorize
            .anyRequest().authenticated() // API 端點都需要認證
        )
        .oauth2ResourceServer(oauth2 -> oauth2
            .jwt(Customizer.withDefaults()) // 使用 JWT 作為承載令牌格式
            // .opaqueToken(Customizer.withDefaults()) // 使用不透明令牌
        );
    return http.build();
}

Spring Security 會自動使用配置的 JwtDecoder 驗證 JWT 簽名、過期時間等,并提取聲明 (Claims) 構(gòu)建 JwtAuthenticationToken。

  • 訪問令牌中的信息: 在控制器或服務(wù)中,可以通過 @AuthenticationPrincipal 注入 Jwt 對象或 JwtAuthenticationToken
@GetMapping("/api/userinfo")
public Map<String, Object> getUserInfo(@AuthenticationPrincipal Jwt jwt) {
    return Map.of(
        "username", jwt.getSubject(),
        "email", jwt.getClaimAsString("email"),
        "scopes", jwt.getClaimAsStringList("scope")
    );
}

最佳實踐與注意事項

  1. 始終使用 PasswordEncoder: 絕對不要存儲明文密碼。
  2. 最小權(quán)限原則: 只授予用戶完成工作所必需的權(quán)限。
  3. 保持依賴更新: Spring Security 會修復(fù)漏洞,及時更新到最新穩(wěn)定版。
  4. 理解 CSRF: 對于有狀態(tài) Web 應(yīng)用(使用 Session 和 Cookie),保持 CSRF 保護啟用。對于純無狀態(tài) API(如只使用 JWT 的 API),可以禁用 CSRF (csrf.disable())。
  5. HTTPS: 在生產(chǎn)環(huán)境中始終使用 HTTPS。
  6. 安全頭: Spring Security 默認設(shè)置了許多安全相關(guān)的 HTTP 響應(yīng)頭 (如 X-Content-Type-Options, X-Frame-Options, Strict-Transport-Security, Content-Security-Policy 等)。理解并根據(jù)需要配置它們 (http.headers(headers -> headers ...))。
  7. 日志與監(jiān)控: 記錄安全相關(guān)事件(登錄成功/失敗、訪問拒絕等)并進行監(jiān)控。
  8. WebSecurityConfigurerAdapter: 在 Spring Security 5.7 中已棄用,在 6.x 中移除。始終使用 SecurityFilterChain Bean 配置。
  9. 謹慎使用 permitAll(): 確保只對真正公開的資源使用它。
  10. 測試: 編寫單元測試和集成測試來驗證你的安全配置是否按預(yù)期工作。使用 @WithMockUser, @WithUserDetails, @WithAnonymousUser 等注解進行模擬用戶測試。

參考

到此這篇關(guān)于Spring Security6.3.x使用指南的文章就介紹到這了,更多相關(guān)Spring Security6.3.x使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA生成xml文件簡單示例

    JAVA生成xml文件簡單示例

    這篇文章主要介紹了JAVA生成xml文件的相關(guān)資料,在Java中可以使用DOM或者JDOM來生成XML文件,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • Springboot如何利用攔截器攔截請求信息收集到日志詳解

    Springboot如何利用攔截器攔截請求信息收集到日志詳解

    一些系統(tǒng)經(jīng)常需要關(guān)注用戶請求的具體信息,如用戶信息、請求參數(shù)、響應(yīng)結(jié)果等等,在SpringBoot應(yīng)用中可通過攔截器的方式統(tǒng)一處理,下面這篇文章主要給大家介紹了關(guān)于Springboot如何利用攔截器攔截請求信息收集到日志的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Java rmi遠程方法調(diào)用基本用法解析

    Java rmi遠程方法調(diào)用基本用法解析

    這篇文章主要介紹了Java rmi遠程方法調(diào)用基本用法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • SpringBoot項目中rest接口定義與參數(shù)傳遞和接收方式

    SpringBoot項目中rest接口定義與參數(shù)傳遞和接收方式

    本文介紹了使用RestClient測試接口的兩種方式:form-data和content-type,form-data適用于所有請求方式,但URL長度有限制,content-type只適用于POST/DELETE/PUT請求,處理application/json格式參數(shù),對于參數(shù)較多的情況,建議使用JavaBean接收
    2026-04-04
  • 通過代碼實例深入解析Java重寫和重載

    通過代碼實例深入解析Java重寫和重載

    這篇文章主要介紹了通過代碼實例深入解析Java重寫和重載,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • 淺談Spring @Async異步線程池用法總結(jié)

    淺談Spring @Async異步線程池用法總結(jié)

    本篇文章主要介紹了淺談Spring @Async異步線程池用法總結(jié),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java動態(tài)代理實現(xiàn)_動力節(jié)點Java學(xué)院整理

    Java動態(tài)代理實現(xiàn)_動力節(jié)點Java學(xué)院整理

    動態(tài)代理作為代理模式的一種擴展形式,廣泛應(yīng)用于框架(尤其是基于AOP的框架)的設(shè)計與開發(fā),本文將通過實例來講解Java動態(tài)代理的實現(xiàn)過程
    2017-08-08
  • SpringBoot工程Docker多環(huán)境中使用同一個Jar包解決方案

    SpringBoot工程Docker多環(huán)境中使用同一個Jar包解決方案

    在Docker多環(huán)境部署中,SpringBoot工程可以通過環(huán)境變量來動態(tài)改變配置,無需重新打包,利用volume掛載或docker?cp命令,可以將配置文件直接傳入容器,提高部署效率,并保證安全性
    2024-09-09
  • JAVA(MAVEN項目)添加JUnit依賴配置全過程

    JAVA(MAVEN項目)添加JUnit依賴配置全過程

    在Maven項目中進行單元測試是確保代碼質(zhì)量的重要步驟,本教程提供SpringBoot和微服務(wù)平臺適用的單元測試方法,包括環(huán)境準備、創(chuàng)建測試類、JUnit簡介及注解使用,環(huán)境準備涉及引入依賴和安裝JUnit插件,測試類創(chuàng)建可通過快捷鍵或手動添加@Test注解來實現(xiàn)
    2024-10-10
  • java實現(xiàn)socket客戶端連接服務(wù)端

    java實現(xiàn)socket客戶端連接服務(wù)端

    本文是個人剛剛開始學(xué)習(xí)如何通過socket去發(fā)送信息下邊的案例,也是書上的在這留下筆記,最后附上一個實例,有需要的小伙伴可以參考下。
    2015-10-10

最新評論

沾化县| 海淀区| 阳信县| 宁阳县| 泰安市| 罗甸县| 平原县| 蛟河市| 高青县| 财经| 栾川县| 阜新市| 灌南县| 连江县| 鹤壁市| 宁德市| 钟山县| 德清县| 泰来县| 湟中县| 镇坪县| 长武县| 汨罗市| 报价| 尉氏县| 河间市| 日照市| 玉龙| 岳池县| 藁城市| 安丘市| 攀枝花市| 太仆寺旗| 广东省| 深州市| 长泰县| 东莞市| 资源县| 平原县| 盈江县| 新昌县|