2024.11.14

这段代码是一个 Spring Security 配置类 SecurityConfiguration,它主要用于配置 Spring Security 的安全策略,定义了如何处理用户认证、授权、会话管理、跨站请求伪造(CSRF)保护等方面的安全性。下面是对这段代码的逐行解释:

1. 类定义

@Configuration
@RequiredArgsConstructor
public class SecurityConfiguration {
  • @Configuration: 这个注解表示该类是一个 Spring 配置类,用于定义 Bean 和配置 Spring 容器。
  • @RequiredArgsConstructor: 由 Lombok 提供的注解,自动生成一个带有所有 final 字段的构造函数。在这个类中,securityHandlerjwtAuthorizeFilter 都是 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)非常常见。
posted @ 2024-11-14 23:12  258333  阅读(2)  评论(0编辑  收藏  举报