在 Spring Boot 中,@PreAuthorize("@bean.checkAuthorization(#argument)")
调用是否基于每个请求进行缓存?
作为一个最小的示例,假设 @Controller
具有以下 REST 端点:
@GetMapping("/api/test") public String testAuthorization() {
String argument;
String foo = service.foo(argument);
String bar = service.bar(argument); // same arguments
return bar + foo;
}
以及service
中的foo
和bar
方法定义如下:
@PreAuthorize("@bean.checkAuthorization(#argument)")
public String foo(String argument) {
return "hello";
}
@PreAuthorize("@bean.checkAuthorization(#argument)")
public String bar(String argument) {
return "world";
}
用例。鉴于Bean.checkAuthorization(argument)
是一个运行成本较高的函数(例如它进行数据库调用),但它是无状态的(即给定参数的结果不会因多次调用而改变),每个请求只需要调用一次。因此,是否可以缓存整个请求的结果,但确保对每个请求都执行检查? (无长期缓存)
最佳答案
这不是一个好主意。
在实现这样的事情时,你很容易受到缓存中毒攻击;也就是说,您将自己暴露在未经您的数据库调用授权的任何人的威胁之下,他们会以您不希望的方式获得授权。
在确定是否应允许用户访问 protected 资源时,最好是承受轻微的性能影响,而不是发生资源泄漏。
更好的选择可能是调查是什么导致数据库调用如此昂贵,或者让企业相信这是保护此资源需要支付的费用。
关于java - 'Pre-Authorized'注释的结果是否被缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54814379/