我有一个现有的Spring MVC应用程序,当前不使用SpringSecurity。我为Hibernate审核日志编写了AuditInterceptor,它需要一种获取当前登录用户的方法。从网上可以找到的最好方法是通过SpringSecurity的SecurityContextHolder。但是,目前我真的不需要任何其他SpringSecurity功能,也不需要重写应用程序当前进行身份验证或授权的方式。
基本上,我想要的是将登录的用户存储到SecurityContextHolder并在AuditInterceptor中重新取回它所需的最少配置。
我的第一次尝试是将以下行添加到当前存在的“登录”页面中:
Authentication auth = new UsernamePasswordAuthenticationToken(u.getName(), u.getPassword());
SecurityContextHolder.getContext().setAuthentication(auth);
并将以下内容添加到拦截器中:
SecurityContext secureContext = SecurityContextHolder.getContext();
Authentication auth = secureContext.getAuthentication();
Object principal = auth.getPrincipal();
String userName = null;
if (principal instanceof UserDetails) {
UserDetails userDetails = (UserDetails) principal;
userName = userDetails.getUsername();
} else {
userName = principal.toString();
}
这是成功的,但不幸的是不是线程安全的。还有其他想法吗?
最佳答案
我不确定您怎么称呼它不是线程安全的。您的实现看起来很好。只要您每次按照实现的方式检索上下文,它都是线程安全的。
SecurityContextHolder是ThreadLocalSecurityContextHolderStrategy的实例,该实例将SecurityContext存储在ThreadLocal中。