我的一个bean中有一个@Cacheable注释方法,我想使用当前登录的用户ID作为Cache的密钥。但是,我正在使用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";
}
}
UserContextService实现:
@Service
public class UserContextServiceImpl implements UserContextService {
public String getCurrentUser() {
return SecurityContextHolder.getContext().getAuthentication().getName();
}
}
我发现了这个问题,但它与我想做的有些不同。我不认为使用静态方法可以实现此功能。
答案 0 :(得分:1)
我会写这个类,以便userId是getInformation()
方法的参数,并让方法/服务的用户自己查找ID。
@Override
@Cacheable("myCache")
public String getInformation(String userId) { ... }
IMO编写服务层以直接使用Spring Security上下文是一种不好的做法,因为它限制了服务的有用性 - 如果您实现某种不使用Spring Security的REST API(就像例如),那么getCurrentUser()
可能没有意义/返回值。如果Spring Security未用于该请求,那么MyServiceImpl
将无法使用,如果您需要支持“管理员用户需要查找用户X的信息”等内容,则此方法无法使用。
让面向Web的层担心如何从安全上下文中提取用户ID,而不是服务层。