我有一个现有的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中。

08-04 19:25