Spring Security 中设计模式的运用

Posted on Sat 01 February 2025 in Journal

Abstract Spring Security 中设计模式的应用
Authors Walter Fan
 Category    learning note  
Status v1.0
Updated 2025-02-01
License CC-BY-NC-ND 4.0

Spring Security 中设计模式的应用

Spring Security 是 Java 企业级应用中广泛使用的安全框架,它采用了多种设计模式来实现灵活、可扩展的安全管理。本文将结合常用实例,深入剖析 Spring Security 中的多个经典设计模式,包括 过滤器模式、拦截器模式、职责链模式、策略模式、工厂模式、装饰器模式和观察者模式,以帮助开发者更好地理解和运用这些模式。


1. 过滤器模式(Filter Pattern)

概念

过滤器模式用于对请求进行预处理或后处理,通常应用于 Web 应用的安全认证和请求校验。Spring Security 主要依靠 Servlet 过滤器(javax.servlet.Filter 处理 HTTP 请求,实现身份验证和授权。

Spring Security 实现

Spring Security 使用 FilterChainProxy 作为入口过滤器,它内部维护了一组安全过滤器(SecurityFilterChain),形成一条安全处理链。

示例:自定义认证过滤器

@Component
public class CustomAuthenticationFilter extends OncePerRequestFilter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain filterChain) throws ServletException, IOException {
        String token = request.getHeader("X-Auth-Token");

        if (token != null) {
            UsernamePasswordAuthenticationToken authRequest =
                new UsernamePasswordAuthenticationToken(token, null);
            Authentication authResult = authenticationManager.authenticate(authRequest);
            SecurityContextHolder.getContext().setAuthentication(authResult);
        }

        filterChain.doFilter(request, response);
    }
}

总结

  • FilterChainProxy 组织多个安全过滤器,形成一个责任链(见下文)。
  • 过滤器在 HTTP 请求级别控制安全性。

2. 拦截器模式(Interceptor Pattern)

概念

拦截器模式允许在请求进入 Controller 之前或执行后进行拦截和处理。Spring Security 通过 MethodSecurityInterceptor 进行方法级别的权限控制。

示例:基于 AOP 的方法安全拦截

@Service
public class UserService {
    @PreAuthorize("hasRole('ADMIN')")
    public void deleteUser(Long userId) {
        System.out.println("删除用户:" + userId);
    }
}

总结

  • @PreAuthorize 让 Spring Security 拦截方法调用。
  • MethodSecurityInterceptor 负责方法级别的权限管理。

3. 职责链模式(Chain of Responsibility Pattern)

概念

职责链模式将请求交给一系列处理对象,每个对象负责处理特定的任务,并将请求传递给下一个处理者。

示例:Spring Security 过滤器链

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtAuthenticationFilter jwtFilter) throws Exception {
        http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)
            .authorizeHttpRequests(auth -> auth.anyRequest().authenticated());
        return http.build();
    }
}

总结

  • SecurityFilterChain 依次执行多个过滤器,每个过滤器完成特定的安全任务。

4. 策略模式(Strategy Pattern)

概念

策略模式定义了一组算法,并将它们封装成独立的策略类,允许在运行时动态切换。

示例:自定义认证策略

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String username = authentication.getName();
        String password = authentication.getCredentials().toString();

        if ("admin".equals(username) && "secret".equals(password)) {
            return new UsernamePasswordAuthenticationToken(username, password, List.of(new SimpleGrantedAuthority("ROLE_ADMIN")));
        }
        throw new BadCredentialsException("用户名或密码错误");
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
    }
}

总结

  • AuthenticationProvider 允许多个认证策略,如 DaoAuthenticationProviderLdapAuthenticationProvider
  • PasswordEncoder 也是策略模式的应用,支持 BCryptPasswordEncoderNoOpPasswordEncoder

5. 工厂模式(Factory Pattern)

概念

工厂模式用于创建对象,而无需指定确切的类。

示例:创建 AuthenticationManager

@Bean
public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
    return http.getSharedObject(AuthenticationManagerBuilder.class)
            .build();
}

总结

  • AuthenticationManagerBuilder 使用工厂模式创建 AuthenticationManager
  • PasswordEncoderFactories 提供默认密码加密器工厂。

6. 装饰器模式(Decorator Pattern)

概念

装饰器模式允许动态扩展对象的功能,而不影响原始类。

示例:装饰 UserDetailsService

@Service
public class CustomUserDetailsService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserDetails user = User.withUsername(username)
                .password("{noop}password")
                .roles("USER")
                .build();
        return new CustomUserDetails(user);
    }
}

总结

  • UserDetailsService 可被 CustomUserDetailsService 装饰,提供额外功能。

7. 观察者模式(Observer Pattern)

概念

观察者模式用于事件驱动系统,Spring Security 通过 ApplicationEventPublisher 处理安全事件。

示例:监听认证成功事件

@Component
public class AuthenticationSuccessListener implements ApplicationListener<AuthenticationSuccessEvent> {
    @Override
    public void onApplicationEvent(AuthenticationSuccessEvent event) {
        System.out.println("用户登录成功: " + event.getAuthentication().getName());
    }
}

总结

  • AuthenticationSuccessEventAuthenticationFailureEvent 适用于事件监听。

总结

设计模式 Spring Security 中的应用
过滤器模式 FilterChainProxy 组织多个安全过滤器
拦截器模式 MethodSecurityInterceptor 进行方法级安全拦截
职责链模式 SecurityFilterChain 依次调用多个过滤器
策略模式 AuthenticationProviderPasswordEncoder 动态切换
工厂模式 AuthenticationManagerBuilderPasswordEncoderFactories
装饰器模式 UserDetailsService 扩展用户信息
观察者模式 监听安全事件,如登录成功

通过这些设计模式,Spring Security 实现了灵活、高扩展性的安全机制!


本作品由 AI 辅助创作, 采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。