从安全上下文中获取当前经过身份验证的用户作为 Spring 缓存的密钥
Get current authenticated user from security context as key for Spring Cache
我有没有参数的方法,我想缓存 return 值。
作为缓存键,我想使用来自安全上下文的当前经过身份验证的用户
@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() {}
请注意,我在示例中使用了 Principal
中的 name
属性。但是如果你有一个自定义的 Principal
对象,你可以投射它并且 return 任何你想要的 属性。
我有没有参数的方法,我想缓存 return 值。 作为缓存键,我想使用来自安全上下文的当前经过身份验证的用户
@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() {}
请注意,我在示例中使用了 Principal
中的 name
属性。但是如果你有一个自定义的 Principal
对象,你可以投射它并且 return 任何你想要的 属性。