CSRF 禁用在 Spring Security 中不起作用

Posted

技术标签:

【中文标题】CSRF 禁用在 Spring Security 中不起作用【英文标题】:CSRF disable doesn't work in Spring Security 【发布时间】:2020-11-21 18:07:21 【问题描述】:

我目前正在使用 Spring Security 测试 REST API。因为这只是测试,所以我禁用了 CSRF。使用下面的代码,对 /users 的 Postman 获取请求可以完美运行,但来自 Postman 的任何其他类型的请求(例如 post、delete、put)都会返回 403 FORBIDDEN 错误。实在想不通。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 
    
    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .httpBasic();
    
  

【问题讨论】:

你的调试日志告诉你? @ThomasAndolf 不,我没有收到任何消息 你的 spring 安全调试日志会告诉你为什么你会被禁止返回,除非你是从 web 浏览器调用 a,然后检查 web 浏览器控制台 (F12) 你就会知道原因对于那里的禁止。使用 Spring 安全日志更新您的问题 @ThomasAndolf 我在哪里可以找到这些日志?我的控制台中没有显示任何内容。 我不知道你是如何运行你的应用程序的,这取决于你是否在 eclipse、intellij、netbeans、命令行等中运行。如果你不知道如何查找/阅读日志,我建议您在尝试 Spring Security 之前先了解一下,以及如何调试您的应用程序。 【参考方案1】:

您是否有任何 cors 配置设置以允许“GET”以外的方法?

您可以创建一个CorsConfigurationSource bean,它应该允许访问这些类型的请求


@Configuration
public class CorsConfig 

    private static final String[] CORS_ALLOWED_HEADERS = new String[] 
        "*",
    ;

    private static final String[] CORS_ALLOWED_METHODS = new String[] 
        "GET",
        "POST",
        "PUT",
        "OPTIONS"
    ;

    private static final String CORS_API_PATTERN = "/api/**";

    private static final long CORS_MAX_AGE = 3600;

    @Value("$cors.allowed-origins")
    private String[] corsAllowedOrigins;

    @Bean
    public CorsConfigurationSource corsConfigurationSource() 

        final CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList(corsAllowedOrigins));
        configuration.setAllowedMethods(Arrays.asList(CORS_ALLOWED_METHODS));
        configuration.setAllowCredentials(true);
        configuration.setMaxAge(CORS_MAX_AGE);
        configuration.setAllowedHeaders(Arrays.asList(CORS_ALLOWED_HEADERS));

        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration(CORS_API_PATTERN, configuration);

        return source;

    

【讨论】:

以上是关于CSRF 禁用在 Spring Security 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 XML 配置仅针对特定 URL 模式在 Spring Security 4 中禁用 CSRF?

Spring Security 3.2 CSRF 禁用特定 URL

如何仅在 localhost 的 Spring Security 中禁用 csrf?

即使禁用 csrf,Spring security 403 禁止错误也会不断发生

Spring-Security对CSRF攻击的支持

Spring Boot - Spring Security CSRF 保护未在登录页面中注入令牌