私はGETメソッドを持つRESTコントローラを持っています。リソースを返します。 Resource
のowner
フィールドを許可されたユーザーのログインと比較することによって、リソースが許可ユーザーに属しているかどうかを確認したいと思います。通常の同期要求で、私はこのような何かをしたい:投稿を承認するSpring非同期コントローラの応答
@RestController
@RequestMapping("/api")
public class AController {
private final AService aService;
public AController(AService aService) {
this.aService = aService;
}
@GetMapping("/resources/{id}")
@PostAuthorize("returnObject.ownerLogin == authentication.name")
public Resource getResource(@PathVariable Long id) {
return aService.getResource(id);
}
}
しかし、コントローラのメソッドが非同期である場合(DeferredResult
で実装)何? AService
インターフェースは次のようになります
@RestController
@RequestMapping("/api")
public class AController {
private final AService aService;
public AController(AService aService) {
this.aService = aService;
}
@GetMapping("/resources/{id}")
@PostAuthorize("returnObject.ownerLogin == authentication.name")
public DeferredResult<Resource> getResource(@PathVariable Long id) {
DeferredResult<Resource> deferredResult = new DeferredResult<>();
aService
.getResourceAsync(id)
.thenAccept(resource -> {
deferredResult.setResult(resource);
});
return deferredResult;
}
}
は:春のセキュリティはobiously上ownerLogin
フィールドを探します2番目の例では
public class Resource {
private String ownerLogin;
// other fields, getters, setters
}
:
@Service
public class AService {
@Async
public CompletableFuture<Resource> getResourceAsync(Long id) {
// implementation...
}
public Resource getResource(Long id) {
// implementation...
}
}
そしてResource
クラスは、単純なDTOですDeferredResult
インスタンス。私は@PostAuthorize
のSPEL式の中でResource
をreturnObject
として非同期的に解決したいと思っています。
可能ですか?たぶん誰かがalternatveのアプローチを提案できますか?どんな提案も大歓迎です。