1

我的一个 bean 中有一个 @Cacheable 注释方法,我想使用当前登录的用户 ID 作为缓存的键。但是,我使用 Spring Security 并在此 bean 中有一个 Injected 服务作为实例变量,它调用 SecurityContextHolder.getContext().getAuthentication() 以返回用户 ID。因此,我在 @Cacheable 方法上有一个零参数构造函数。无论如何使用从我的注入服务的方法返回的用户 ID 作为缓存的键?

@Service
public class MyServiceImpl implements MyService {

@Inject
private UserContextService userContextService;

@Override
@Cacheable("myCache")
public String getInformation() {
  //use this as the key for the cache entry
String userId = userContextService.getCurrentUser();
return "something";
}
}

用户上下文服务实现:

@Service
public class UserContextServiceImpl implements UserContextService {

public String getCurrentUser() {
return SecurityContextHolder.getContext().getAuthentication().getName();
}

}

我发现了这个问题,但这与我想做的有些不同。我认为静态方法无法实现此功能。

使用带有 @Cacheable 注释的 Spring bean 作为键

4

1 回答 1

1

我会编写这个类,以便 userId 是方法的参数getInformation(),并让方法/服务的用户自己通过查找 ID。

@Override
@Cacheable("myCache")
public String getInformation(String userId) { ... }

IMO 编写服务层以直接使用 Spring Security 上下文是一种不好的做法,因为它限制了服务的有用性 - 如果您实现某种不使用 Spring Security 的 REST API(仅作为示例),那么getCurrentUser()可能没有意义/返回值。如果该请求未使用 Spring Security,则thenMyServiceImpl将不可用,如果您需要支持“管理员用户需要查找用户 X 的信息”之类的内容,则此方法将不可用。

让面向 Web 的层担心如何从安全上下文中提取用户 ID,而不是您的服务层。

于 2012-08-03T19:19:12.133 回答