You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebSecurityConfigurerAdapter替代方案:Spring Security新API适配问题

用Spring Security新API实现MVC与REST分路径认证

Spring Security 5.7+废弃WebSecurityConfigurerAdapter后,核心替代方案是通过定义多个SecurityFilterChain Bean,针对不同请求路径配置差异化认证规则。以下是对应你需求的具体实现:

核心实现代码

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
public class MultiSecurityConfig {

    // 处理MVC请求的认证链:表单登录
    @Bean
    public SecurityFilterChain mvcSecurityFilterChain(HttpSecurity http) throws Exception {
        http
            .requestMatcher("/mvc/**") // 拦截所有/mvc前缀的请求
            .authorizeHttpRequests(auth -> auth
                .anyRequest().authenticated()
            )
            .formLogin(form -> form
                .loginPage("/login") // 自定义登录页路径(按需调整)
                .permitAll()
            );
        return http.build();
    }

    // 处理REST API请求的认证链:HTTP Basic认证
    @Bean
    public SecurityFilterChain restSecurityFilterChain(HttpSecurity http) throws Exception {
        http
            .requestMatcher("/api/**") // 拦截所有/api前缀的请求
            .csrf(csrf -> csrf.disable()) // REST API场景通常禁用CSRF
            .authorizeHttpRequests(auth -> auth
                .anyRequest().authenticated()
            )
            .httpBasic(); // 启用HTTP Basic认证
        return http.build();
    }

    // 示例:内存用户服务(实际项目可替换为数据库实现)
    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withUsername("user")
            .password(passwordEncoder().encode("password"))
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user);
    }

    // 密码编码器
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

关键细节说明

  1. 多认证链区分规则
    每个SecurityFilterChain通过requestMatcher指定拦截的请求范围,Spring Security会按Bean定义顺序匹配请求,匹配到第一个符合规则的链就会使用其配置。你可以根据实际项目调整路径前缀(比如REST用/api/**,MVC用/**排除/api/**等)。

  2. MVC表单登录配置
    针对传统Web场景,保留了表单登录的完整流程,支持自定义登录页、会话保持等特性,符合MVC应用的用户交互习惯。

  3. REST Basic认证配置
    针对API调用场景,启用HTTP Basic认证,通过请求头传递用户名密码,默认无状态(不创建会话),适配REST客户端的调用逻辑。

  4. 优先级控制
    如果存在多个重叠的请求匹配规则,可以通过@Order注解指定认证链的优先级(数值越小优先级越高),避免规则冲突。

内容的提问来源于stack exchange,提问作者Andrzej Jankowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:30:27