java - 检索用户所需的最低 SpringSecurity 配置

标签 java spring spring-security

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

相关文章:

java - 使用 spring 从一个 api 向另一个 api 发出发布请求

java - Guava LoadingCache中的load()方法是什么?

java - 找不到 SecurityMockMvcConfigurers

spring - 如何使用 keycloak 和 spring 读取所有用户?

java - Spring 3.1 LDAP 认证流程 : "Bad Credentials" msg When Credentials Are Good

java - glide 不从 SD 卡加载图像

java - 除了日志级别之外如何过滤log4j日志?

java - 在spring mvc中按名称获取cookie值

java - 如何为 JavaEE 应用程序中的 PostgreSQL 热备设置配置连接故障转移?

java - REST Controller 中 RequestParam 的正确方法