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

Spring Security中permitAll()不生效,如何解决?

问题:Spring Security未放行指定POST请求路径

已配置SecurityFilterChain允许特定路径的POST请求,但发起请求时系统未识别目标路径,仍将请求交由安全过滤器处理,不符合预期。

当前SecurityFilterChain配置

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http
               .csrf().disable()
               .sessionManagement()
                   .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                   .and()
               .authorizeRequests()
                   .antMatchers(HttpMethod.POST, "/login").permitAll() 
                   .antMatchers("/v3/api-docs/**", "/swagger-ui.html", "/swagger-ui/**").permitAll()
                   .anyRequest().authenticated()
                   .and()
               .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
        .build();
}

控制器代码

@RestController
@RequestMapping("/cadastrar")
public class CadastroController {

    @Autowired
    private CadastroService cadastroService;
    
    @PostMapping("/cadastro-usuario")
    @Transactional
    public ResponseEntity<Object> cadastrar(@RequestBody @Valid DadosCadastroUsuario dados ){
        try{
            cadastroService.cadastrarUsuario(dados);
            return ResponseEntity.status(HttpStatus.CREATED).header("Location", "/login").build();
        } catch (Exception e){
           return ResponseEntity.badRequest().body(e.getMessage());
        }
    }

    @PostMapping("/cadastro-loja")
    @Transactional
    public ResponseEntity<Object> cadastrar(@RequestBody @Valid DadosCadastroLoja dados) throws Exception {
        try{
            cadastroService.cadastrarLoja(dados);
            return ResponseEntity.status(HttpStatus.CREATED).header("Location", "/login").build();
        } catch (Exception e) {
            return ResponseEntity.badRequest().body(e.getMessage());
        }
    }
}

请求信息

发起请求的URL为:https://localhost:443/cadastrar/cadastro-usuario,已确认请求路径与控制器配置一致。


解决方案

问题原因

SecurityFilterChain配置中未对/cadastrar/**路径的POST请求设置放行规则,导致该路径被anyRequest().authenticated()拦截,进入安全过滤器处理流程。

修改后的配置代码

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http
               .csrf().disable()
               .sessionManagement()
                   .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                   .and()
               .authorizeRequests()
                   // 新增/cadastrar/**的POST请求放行规则
                   .antMatchers(HttpMethod.POST, "/login", "/cadastrar/**").permitAll() 
                   .antMatchers("/v3/api-docs/**", "/swagger-ui.html", "/swagger-ui/**").permitAll()
                   .anyRequest().authenticated()
                   .and()
               .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
        .build();
}

关键说明

  • 在antMatchers(HttpMethod.POST, ...)中添加/cadastrar/**,即可放行所有以/cadastrar/开头的POST请求,覆盖控制器中/cadastrar/cadastro-usuario和/cadastrar/cadastro-loja两个接口。
  • Spring Security的规则匹配按配置顺序执行,需将具体放行规则放在anyRequest()之前,否则会被全局认证规则覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:23:10