介绍
Spring Security 6.3.1 是一个重要的版本更新,它建立在 Spring Security 6 的核心现代化架构之上,提供了更简洁的配置、更好的默认安全性以及对最新安全标准的支持。以下是一个 Spring Security 6.3.1 的使用指南,涵盖核心概念、配置和常见任务:
核心理念:
- Lambda DSL (推荐): Spring Security 6 开始大力推广基于 Lambda 的 DSL (领域特定语言) 配置方式,它更简洁、类型安全,并且避免了链式调用
.and()的繁琐。这是当前推荐的配置方式。 - 组件化: 安全配置被分解为更小、更专注的组件 (
SecurityFilterChain,UserDetailsService,PasswordEncoder,AuthenticationProvider等),提高了灵活性和可测试性。 - 默认安全性增强: 默认配置提供了更强的安全防护(例如,默认启用 CSRF 保护,更安全的会话管理)。
- Servlet 和 Reactive 分离: API 清晰区分了 Servlet (传统 Web) 和 Reactive (响应式 WebFlux) 应用的支持。
- OAuth2 和 OIDC 现代化: 对 OAuth 2.1 和 OpenID Connect 1.0 提供了更现代、更符合规范的支持。
基础配置 (Servlet 应用 - 使用 Lambda DSL)
核心配置类 (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 Exception {
http
.authorizeHttpRequests(authorize -> authorize
.requestMatchers(, , , , , ).permitAll()
.requestMatchers().hasRole()
.requestMatchers().hasRole()
.anyRequest().authenticated()
)
.formLogin(formLogin -> formLogin
.permitAll()
.defaultSuccessUrl()
)
.logout(logout -> logout
.logoutUrl()
.logoutSuccessUrl()
.permitAll()
)
.exceptionHandling(exceptionHandling -> exceptionHandling
.accessDeniedPage()
)
http.build();
}
UserDetailsService {
User.builder()
.username()
.password(passwordEncoder.encode())
.roles()
.build();
User.builder()
.username()
.password(passwordEncoder.encode())
.roles(, )
.build();
(user, admin);
}
PasswordEncoder {
();
}
}


