使用异步CompletableFuture<Dto>总是返回403

问题描述 投票:0回答:1

我正在使用必须上传大文件的控制器,问题是当返回时

CompletableFuture<ResponseEntity<ExecutionDto>>
它总是返回错误403,但是当我更改返回类型时,它成功返回DTO,但它被阻塞。身份验证工作正常。可能是什么问题?

@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public CompletableFuture<ResponseEntity<ExecutionDto>> handleFileUpload(
        @RequestPart("file1") MultipartFile file1,
        @RequestPart(value = "file2", required = false) MultipartFile file2) throws ExecutionException, InterruptedException {

    List<MultipartFile> files = new ArrayList<>();
    files.add(file1);
    if (file2 != null && !file2.isEmpty()) {
        files.add(file2);
    }

    User user = userRepository.findByEmailWithAgency(userService.getAuthenticatedUser().getEmail()).get();

    String uploadId = "upload_" + System.currentTimeMillis();
    System.out.println("Upload ID : " + uploadId);
    progressTracker.initializeProgress(uploadId);

    return executionService.handleFileUpload(files, uploadId, user)
            .thenApply(ResponseEntity::ok);
}

我尝试在服务上添加安全上下文,但仍然没有任何结果。

java spring spring-mvc spring-security
1个回答
0
投票

要解决此问题,您需要确保安全上下文传播到执行

CompletableFuture
的线程。有几种方法可以做到这一点:

  1. @Async
    与安全上下文传播一起使用。
    如果您的应用程序使用 Spring 的
    @Async
    进行异步处理,则可以将
    @Async
    注解与
    SecurityContextHolder
    策略配置结合使用。
  2. CompletableFuture
    中手动传播安全上下文。
    或者,您可以在使用
    CompletableFuture
    时手动传播安全上下文。
© www.soinside.com 2019 - 2024. All rights reserved.