假设我有以下控制器。 (假设Order.customer
是该订单所属的客户,并且只有他们才能访问该订单。)
@RestController
@RequestMapping("/orders")
public class OrderController {
@GetMapping
@PostAuthorize("returnObject.customer == authentication.principal")
public Order getOrderById(long id) {
/* Look up the order and return it */
}
}
查找订单后,使用
@PostAuthorize
确认它属于已认证的客户。如果不是,Spring会以403 Forbidden响应。这样的实现存在一个问题:客户可以区分不存在的订单和无法访问的订单。理想情况下,在两种情况下都应返回404。
虽然可以通过将
Authentication
注入处理程序方法并在其中实现自定义逻辑来解决此问题,但是否有任何方法可以使用@PostAuthorize
或类似的声明性API来实现呢? 最佳答案
您可以尝试使用ControllerAdvice来捕获和转换PostAuthorize引发的AccessDeniedException。
@RestControllerAdvice
public class ExceptionHandlerController {
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(AccessDeniedException.class)
public String handleAccessDenied(AccessDeniedException e) {
return "nothing here"; // or a proper object
}
}