2024.11.14
这段代码是一个 Spring Security 配置类 SecurityConfiguration
,它主要用于配置 Spring Security 的安全策略,定义了如何处理用户认证、授权、会话管理、跨站请求伪造(CSRF)保护等方面的安全性。下面是对这段代码的逐行解释:
1. 类定义
@Configuration
@RequiredArgsConstructor
public class SecurityConfiguration {
@Configuration
: 这个注解表示该类是一个 Spring 配置类,用于定义 Bean 和配置 Spring 容器。@RequiredArgsConstructor
: 由 Lombok 提供的注解,自动生成一个带有所有final
字段的构造函数。在这个类中,securityHandler
和jwtAuthorizeFilter
都是final
字段,因此 Lombok 会自动生成一个构造函数来注入这两个依赖。
2. 字段定义
private final SecurityHandler securityHandler;
private final JwtAuthorizeFilter jwtAuthorizeFilter;
securityHandler
: 这是一个自定义的处理器,负责处理 Spring Security 的认证、授权、登录、登出等操作。jwtAuthorizeFilter
: 这是一个自定义的过滤器,用于在请求中验证 JWT(JSON Web Token)是否有效。
3. passwordEncoder
Bean
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
- 这个 Bean 定义了一个
PasswordEncoder
,并指定使用BCryptPasswordEncoder
,这是一种常见的加密密码方式,用于加密存储密码。
4. filterChain
Bean
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
SecurityFilterChain
是 Spring Security 配置的核心部分,用于定义 Web 安全配置。HttpSecurity
是用来配置 HTTP 请求的安全性设置。
5. 请求授权配置
http
.authorizeHttpRequests(conf -> conf
// 需要校验的接口
.requestMatchers(SecurityConst.AUTH_CHECK_ARRAY).authenticated()
// 注册接口
.anyRequest().permitAll()
)
authorizeHttpRequests()
: 配置 HTTP 请求的授权规则。requestMatchers(SecurityConst.AUTH_CHECK_ARRAY).authenticated()
: 表示SecurityConst.AUTH_CHECK_ARRAY
中列出的 URL 路径需要认证才能访问(即需要登录)。anyRequest().permitAll()
: 其它所有请求都可以不需要认证,直接允许访问。
6. 登录配置
.formLogin(conf -> conf
// 登录页面
.loginProcessingUrl(SecurityConst.LOGIN_PAGE)
// 成功登录处理
.successHandler(securityHandler::onAuthenticationSuccess)
// 失败登录处理
.failureHandler(securityHandler::onAuthenticationFailure)
)
formLogin()
: 配置表单登录。loginProcessingUrl(SecurityConst.LOGIN_PAGE)
: 配置处理登录请求的 URL。successHandler(securityHandler::onAuthenticationSuccess)
: 配置登录成功后的处理逻辑,调用securityHandler.onAuthenticationSuccess
方法。failureHandler(securityHandler::onAuthenticationFailure)
: 配置登录失败后的处理逻辑,调用securityHandler.onAuthenticationFailure
方法。
7. 登出配置
.logout(conf -> conf
// 登出页面
.logoutUrl(SecurityConst.LOGOUT_PAGE)
// 退出登录处理
.logoutSuccessHandler(securityHandler::onLogoutSuccess)
)
logout()
: 配置登出相关的设置。logoutUrl(SecurityConst.LOGOUT_PAGE)
: 配置处理登出请求的 URL。logoutSuccessHandler(securityHandler::onLogoutSuccess)
: 配置登出成功后的处理逻辑,调用securityHandler.onLogoutSuccess
方法。
8. 异常处理配置
.exceptionHandling(conf -> conf
// 没有登录处理
.authenticationEntryPoint(securityHandler::onUnAuthenticated)
// 没有权限处理
.accessDeniedHandler(securityHandler::onAccessDeny)
)
exceptionHandling()
: 配置处理认证和授权异常的逻辑。authenticationEntryPoint(securityHandler::onUnAuthenticated)
: 当用户未登录时,调用securityHandler.onUnAuthenticated
处理该异常。accessDeniedHandler(securityHandler::onAccessDeny)
: 当用户没有权限访问某资源时,调用securityHandler.onAccessDeny
处理该异常。
9. CSRF 禁用
.csrf(AbstractHttpConfigurer::disable)
.csrf(AbstractHttpConfigurer::disable)
: 禁用 CSRF(跨站请求伪造)保护,因为在使用 JWT 等无状态认证时,通常不需要 CSRF 防护。
10. 会话管理
.sessionManagement(conf -> conf.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.sessionManagement()
: 配置会话管理策略。SessionCreationPolicy.STATELESS
: 配置为无状态会话,即不使用服务器端的 HTTP session。每个请求必须携带有效的 JWT token。
11. JWT 过滤器
.addFilterBefore(jwtAuthorizeFilter, UsernamePasswordAuthenticationFilter.class)
addFilterBefore()
: 将自定义的jwtAuthorizeFilter
放置在UsernamePasswordAuthenticationFilter
之前进行处理。jwtAuthorizeFilter
用于验证请求中携带的 JWT token 是否有效。
12. 构建 SecurityFilterChain
.build();
- 最后调用
.build()
方法将所有配置整合成一个完整的SecurityFilterChain
实例。
总结
- 这个类配置了 Spring Security 的核心安全策略,包括身份验证(使用表单登录)、权限控制、异常处理、会话管理(无状态)、JWT 验证等。
- 使用了
SecurityHandler
处理认证、授权、登录、登出等过程,JwtAuthorizeFilter
用于验证请求中的 JWT token。 - 还禁用了 CSRF,配置了无状态会话,这对于基于 token 的认证(如 JWT)非常常见。