【发布时间】:2017-12-26 19:07:13
【问题描述】:
我有一个带有 GET 方法的 REST 控制器。它返回一个资源。我想通过将Resource 上的owner 字段与授权用户的登录名进行比较来验证资源是否属于授权用户。对于正常的同步请求,我会做这样的事情:
@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 实现)呢?
@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;
}
}
AService 界面如下所示:
@Service
public class AService {
@Async
public CompletableFuture<Resource> getResourceAsync(Long id) {
// implementation...
}
public Resource getResource(Long id) {
// implementation...
}
}
而Resource 类是一个简单的 DTO:
public class Resource {
private String ownerLogin;
// other fields, getters, setters
}
在第二个示例中,Spring Security 显然会在 DeferredResult 实例上查找 ownerLogin 字段。我希望它将异步解析的Resource 视为@PostAuthorize SPEL 表达式中的returnObject。
有可能吗?也许有人可以建议一种替代方法?欢迎提出任何建议。
【问题讨论】:
标签: spring asynchronous spring-security spring-web deferred-result