当使用授权头(bearer jwt令牌)时,spring-security是否自动禁用CSRF?

watbbzwu  于 2023-03-02  发布在  Spring
关注(0)|答案(2)|浏览(282)

我已经通过spring Boot 应用程序配置了一个oauth2资源服务器,它在每个请求中都需要JWT令牌。我看到了一些Spring Security的行为,如下所示:
1.如果我没有通过 JWT 考试

curl -X POST  --data '{"somejson":"some data"}' --header "Content-Type: application/json" http://localhost:8080

API给出如下响应:

An expected CSRF token cannot be found

1.但是如果我像下面的请求那样传递JWT tokenin authorization头,那么Spring不会抱怨CSRF。

curl -X POST  --data '{"somejson":"some data"}' --header "Content-Type: application/json" --header "Authorization: Bearer JWTfirstpart.secondpart.thirdpart" http://localhost:8080

当auth报头存在时,spring security是否自动禁用CSRF检查?
我的Spring安全配置如下所示

SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http
                .authorizeExchange(exchanges -> exchanges
                        .anyExchange().authenticated()
                )
                .oauth2ResourceServer(ServerHttpSecurity.OAuth2ResourceServerSpec::jwt);
        return http.build();
    }

我根据此处的Spring文档构建了配置https://docs.spring.io/spring-security/reference/reactive/oauth2/resource-server/jwt.html

643ylb08

643ylb081#

我不知道这样的行为。根据代码,默认情况下,它将禁用CSRF的GETHEADTRACEOPTIONS请求只。应该有在您的代码的地方更改相关的请求匹配器配置。
您可以在以下代码中设置断点以进行故障排除,并查看是谁更改了请求匹配器。

  • CsrfWebFilter#setRequireCsrfProtectionMatcher()
  • CsrfWebFilter#filter()
cpjpxq1n

cpjpxq1n2#

这种行为是由于OAuth2ResourceServerConfigurer#registerDefaultCsrfOverride造成的,它不会通过使用BearerTokenRequestMatcher将CSRF令牌验证应用于包含Bearer令牌的请求。
这就是为什么当我发送JWT承载令牌时,没有应用csrf检查,但是当我不发送JWT承载令牌时,请求失败并显示"CSRF令牌丢失"错误。
资料来源:
1.这是对相关问题https://stackoverflow.com/a/71782433/4627552的出色回答

  1. Spring安全问题讨论页https://github.com/spring-projects/spring-security/issues/8668

相关问题