我有一个现有的 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 中。
关于java - 检索用户所需的最低 SpringSecurity 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5427594/