java - 'Pre-Authorized'注释的结果是否被缓存?

标签 java spring spring-boot spring-security

在 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中的foobar方法定义如下:

@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/

相关文章:

java - IntelliJ 代码完成不适用于新的 Java 类

java - IntelliJ 中的 Spring 应用程序上下文文件位置

java - 如何在运行时从数据库动态加载身份提供者 (IdP) Sprint Security SAML

java - 命名参数 [XXX] 未在此过程调用中注册

java - o.apache.kafka.clients.NetworkClient - 引导代理 <主机名> :9092 disconnected

java - 如何在 JUNIT 的wiremock 中匹配精确的 json

java - 解释一下派生接口(interface)是什么意思?

java - 声明主方法同步

java - 使用 Unicode 文本还是 Unicode 字符串?

java - 如何在基于 XML 的 Spring 配置文件中加载基于 Java 的 SecurityConfig?