HttpSecurity
HttpSecurity
是 Spring Security 中用于配置基于 HTTP 請求的安全策略的核心構建器,支持細粒度控制請求授權、認證、登錄、登出、CSRF、CORS、會話管理等安全功能。
package xyz.idoly.demo;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http// 請求授權配置.authorizeHttpRequests(auth -> auth.requestMatchers("/public/**").permitAll() // /public 下路徑允許所有訪問.requestMatchers("/admin/**").hasRole("ADMIN") // /admin 下路徑需管理員角色.anyRequest().authenticated() // 其它請求都需要認證)// 表單登錄配置.formLogin(form -> form.loginPage("/login") // 自定義登錄頁面.permitAll() // 登錄頁面允許所有訪問.defaultSuccessUrl("/home", true) // 登錄成功后跳轉主頁)// HTTP Basic 登錄(用于 API 認證).httpBasic(Customizer.withDefaults())// 登出配置.logout(logout -> logout.logoutUrl("/logout").logoutSuccessUrl("/login?logout").invalidateHttpSession(true).deleteCookies("JSESSIONID"))// CSRF 保護(默認開啟,示例中未禁用).csrf(csrf -> csrf// 可以定制 CSRF 規則,示例保持默認)// CORS 配置(示例占位).cors(cors -> {// 可以配置 CorsConfigurationSource})// 會話管理.sessionManagement(session -> session.maximumSessions(1).maxSessionsPreventsLogin(true))// 記住我功能.rememberMe(Customizer.withDefaults());return http.build();}
}
方法名 | 功能描述 | Lambda DSL 示例 |
---|---|---|
authorizeHttpRequests(...) | 路徑權限控制:根據 URL 路徑定義哪些請求需要認證、授權或匿名訪問。 | http.authorizeHttpRequests(auth -> auth.requestMatchers("/public/**").permitAll().anyRequest().authenticated()); |
formLogin(...) | 表單登錄配置:啟用表單登錄,自定義登錄頁、成功失敗跳轉路徑等。 | http.formLogin(form -> form.loginPage("/login").permitAll()); |
httpBasic(...) | HTTP Basic 登錄配置:用于 API 或測試環境的簡單認證。 | http.httpBasic(Customizer.withDefaults()); |
logout(...) | 登出功能配置:定義登出 URL、登出成功跳轉等。 | http.logout(logout -> logout.logoutUrl("/logout").logoutSuccessUrl("/login?logout")); |
csrf(...) | CSRF 防護:默認啟用,API 項目常禁用。 | http.csrf(csrf -> csrf.disable()); |
cors(...) | 跨域配置:允許跨域請求,適用于前后端分離架構。 | http.cors(cors -> { /* 配置 CorsSource */ }); |
headers(...) | 安全響應頭配置:如 X-Frame-Options 等,提升瀏覽器安全性。 | http.headers(headers -> headers.frameOptions(frame -> frame.sameOrigin())); |
sessionManagement(...) | 會話管理:控制最大會話數、并發登錄策略等。 | http.sessionManagement(session -> session.maximumSessions(1).maxSessionsPreventsLogin(true)); |
exceptionHandling(...) | 異常處理配置:如訪問拒絕或未認證處理方式。 | http.exceptionHandling(eh -> eh.accessDeniedPage("/403")); |
authenticationManager(...) | 指定認證管理器:用于自定義認證邏輯入口。 | http.authenticationManager(authManager); |
authenticationProvider(...) | 注冊認證提供器:支持多種認證邏輯。 | http.authenticationProvider(customProvider); |
userDetailsService(...) | 設置用戶詳情服務:從用戶名加載權限等。 | http.userDetailsService(myUserDetailsService); |
securityMatcher(...) | 限定配置作用路徑:只對指定路徑生效。 | http.securityMatcher("/api/**"); |
addFilter(...) | 添加自定義 Filter 到過濾器鏈。 | http.addFilter(new CustomFilter()); |
addFilterBefore(...) | 在指定 Filter 之前添加 Filter。 | http.addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class); |
addFilterAfter(...) | 在指定 Filter 之后添加 Filter。 | http.addFilterAfter(new CustomFilter(), SecurityContextPersistenceFilter.class); |
addFilterAt(...) | 精確替換指定 Filter 位置。 | http.addFilterAt(new CustomFilter(), BasicAuthenticationFilter.class); |
with(...) | 啟用自定義 DSL 模塊,替代 apply(…)。 | http.with(MyDsl.class, dsl -> dsl.customOption(...)); |
redirectToHttps(...) | 強制 HTTPS 跳轉:配置端口映射后啟用。 | http.redirectToHttps(https -> https.portMapper(mapper -> mapper.http(8080).mapsTo(8443))); |
dispatcherTypeMatchers(...) | 匹配 DispatcherType,如 ERROR、ASYNC。 | http.authorizeHttpRequests(auth -> auth.dispatcherTypeMatchers(DispatcherType.ERROR).permitAll()); |
passwordManagement(...) | 密碼管理入口配置:啟用密碼修改功能。 | http.passwordManagement(pm -> pm.changePasswordPage("/change-password")); |
oidcLogout(...) | 配置 OIDC 單點登出功能。 | http.oidcLogout(oidc -> oidc.backChannel()); |
oneTimeTokenLogin(...) | 啟用一次性登錄令牌功能。 | http.oneTimeTokenLogin(token -> token.loginUrl("/login/token")); |
webAuthn(...) | WebAuthn 無密碼認證配置。 | http.webAuthn(wa -> wa.rpName("MyApp")); |
setSharedObject(...) | 注入共享對象供后續配置使用。 | http.setSharedObject(CustomService.class, myService); |
build() / performBuild() | 構建過濾器鏈,返回 SecurityFilterChain。 | return http.build(); |