我已经通过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
2条答案
按热度按时间643ylb081#
我不知道这样的行为。根据代码,默认情况下,它将禁用CSRF的
GET
,HEAD
,TRACE
和OPTIONS
请求只。应该有在您的代码的地方更改相关的请求匹配器配置。您可以在以下代码中设置断点以进行故障排除,并查看是谁更改了请求匹配器。
CsrfWebFilter#setRequireCsrfProtectionMatcher()
CsrfWebFilter#filter()
cpjpxq1n2#
这种行为是由于
OAuth2ResourceServerConfigurer#registerDefaultCsrfOverride
造成的,它不会通过使用BearerTokenRequestMatcher将CSRF令牌验证应用于包含Bearer令牌的请求。这就是为什么当我发送JWT承载令牌时,没有应用csrf检查,但是当我不发送JWT承载令牌时,请求失败并显示"CSRF令牌丢失"错误。
资料来源:
1.这是对相关问题https://stackoverflow.com/a/71782433/4627552的出色回答