Spring boot 使用springboot/springsecurity配置公共端点适用于GET,但不适用于POST

Spring boot 使用springboot/springsecurity配置公共端点适用于GET,但不适用于POST,spring-boot,spring-security,Spring Boot,Spring Security,我的Spring启动应用程序提供了几个端点。接下来,我想在默认情况下限制所有端点,以便它们需要通过JWT令牌进行身份验证。只有某些路径是公共的。我的理解是,.antMatchers(PUBLIC_RESOURCES).permitAll()中定义的所有路径都将是“PUBLIC”的,无需任何身份验证 这对于GET方法很好,但是当用POST命中同一个端点时,我会得到一个HTTP 403(禁止)。我不明白为什么会这样 这是我当前的安全配置: @配置 @EnableGlobalMethodSecurit

我的Spring启动应用程序提供了几个端点。接下来,我想在默认情况下限制所有端点,以便它们需要通过JWT令牌进行身份验证。只有某些路径是公共的。我的理解是,
.antMatchers(PUBLIC_RESOURCES).permitAll()
中定义的所有路径都将是“PUBLIC”的,无需任何身份验证

这对于
GET
方法很好,但是当用
POST
命中同一个端点时,我会得到一个HTTP 403(禁止)。我不明白为什么会这样

这是我当前的安全配置:

@配置
@EnableGlobalMethodSecurity(Prespenabled=true)
公共类安全配置扩展了WebSecurity配置适配器{
私有静态最终字符串[]公共资源={
"/",
“/user/login”
};
@凌驾
受保护的无效配置(最终HttpSecurity HttpSecurity)引发异常{
httpSecurity
.antMatcher(“/**”).authorizedRequests()
.antMatchers(公共资源).permitAll()
.anyRequest().authenticated();
}
}
以及控制器:

@RestController
@请求映射(path=“user”)
公共类登录控制器{
@GetMapping
公共字符串get(){
返回“嘿,乔(得到)”;
}
@邮戳
公共字符串post(){
返回“嘿,乔(帖子)”;
}
}

这可能是因为
CSRF
保护影响了所有改变服务器状态的请求(POST、PUT、DELETE等)

您可以在此处阅读有关csrf的更多信息:

我猜你想禁用它(我不推荐,因为这是一个安全功能)

如何在spring security中禁用csrf

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) {
        http
            .csrf(csrf -> csrf.disable());
    }
}
我强烈建议打开spring安全调试日志记录,日志将准确地告诉您请求被拒绝的原因

应用程序属性

logging.level.org.springframework.security=DEBUG

谢谢,这澄清了问题。禁用CSRF的快速测试表明,这是根本原因。最后,我将
.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
添加到安全配置中。