如何解决从安全上下文中获取当前经过身份验证的用户作为 Spring Cache 的密钥
我有没有参数的方法,我想缓存返回值。 作为缓存密钥,我想使用安全上下文中当前经过身份验证的用户
@Cacheable(value = "resultCache",key="#userPrincipal.id")
public result getResult() {}
有没有可能,或者我的想法是错误的。
解决方法
您有四种选择来实现这一目标:
-
将
Authentication
对象作为方法参数发送:@Cacheable(value = "resultCache",key="#authentication.name") public Result getResult(Authentication authentication) {}
-
创建自定义
KeyGenerator
并在您的@Cacheable
注释中使用public class CustomKeyGenerator implements KeyGenerator { @Override public Object generate(Object target,Method method,Object... params) { return SecurityContextHolder.getContext().getAuthentication().getName(); } } @Configuration @EnableCaching public class CacheConfiguration { @Bean("customKeyGenerator") public KeyGenerator customKeyGenerator() { return new CustomKeyGenerator(); } } @Cacheable(value = "resultCache",keyGenerator="customKeyGenerator") public Result getResult() {}
-
创建一个 bean,它为您提供密钥并通过
key
属性中的 SPeL 引用它。我建议您采用这种方法,因为它可以让您稍后更轻松地更改值。@Component public class CacheKeyProvider { public String getUsernameKey() { return SecurityContextHolder.getContext().getAuthentication().getName(); } } @Cacheable(value = "resultCache",key="@cacheKeyProvider.getUsernameKey()") public Result getResult() {}
-
@Cacheable(value = "resultCache",key="T(org.springframework.security.core.context.SecurityContextHolder.getContext()?.authentication?.name)") public Result getResult() {}
请注意,我在示例中使用了 name
中的 Principal
属性。但是,如果您有一个自定义的 Principal
对象,您可以对其进行转换并返回您想要的任何属性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。