Spring Security 为什么延迟结果返回401?

9rygscc1  于 2023-03-08  发布在  Spring
关注(0)|答案(2)|浏览(201)

我遇到了一个奇怪的问题。如果我调用一个返回DeferredResult的端点,即使它返回的响应是200,它也会以401的形式到达。我还通过调用这个端点对postman进行了测试,如果我调用一个普通的端点,它会返回正确的响应。

@RequestMapping(path = "/sign-document1", method = RequestMethod.GET)
    public DeferredResult<ResponseEntity<?>> signFile1(){
        DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>(5000L);
        deferredResult.onTimeout(() -> deferredResult.setErrorResult(
                ResponseEntity
                        .status(HttpStatus.REQUEST_TIMEOUT)
                        .body("Request timeout!")));

        deferredResult.setResult(new ResponseEntity<>(HttpStatus.OK));
    
        return deferredResult; //this is received as 401
    }
@RequestMapping(path = "/sign-document2", method = RequestMethod.GET)
    public ResponseEntity<?> signFile2(){

        return new ResponseEntity<>(HttpStatus.OK); //received as 200
    }

我在https://spring.io/blog/2022/11/24/spring-boot-3-0-goes-ga上找到了一条关于这个的评论:
迁移到Spring Boot 3后,返回类型为DeferredResult的一个端点现在将返回HTTP代码401。经过一番调查,我发现这是由于spring.security.filter.dispatcher-types属性的默认值发生了变化。应记录此变化。
答案是www.example.comhttps://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#dispatch-types
所以我设置了spring.security.filter.dispatcher-types=request, async, error, forward, include,我仍然有同样的问题。
任何帮助都很感激。

inkz8wg9

inkz8wg91#

在Spring Security 6中,授权规则现在应用于所有调度程序类型。
在Spring Security 6.0.0中,SecurityContextHolderFilterwas not applied to ASYNC dispatches,因此没有为这些请求加载SecurityContext。此问题在Spring Security 6.0.1中已出现。
建议升级到Sping Boot 〉= 3.0.1,或者,如果不可能,应用此解决方法。

yr9zkbsy

yr9zkbsy2#

看起来如果我把spring.security.filter.dispatcher-types设置为空,它就可以工作了。如果有人能解释一下为什么,我将非常感激。

相关问题