java - Spring Security 在 Spring Boot 中检索用户名时提供 Null 身份验证

标签 java spring spring-boot spring-security

我尝试像这样获取用户名:

public static String getUsername() {
    SecurityContext context = SecurityContextHolder.getContext();
    UserDetails userDetails = (UserDetails) context.getAuthentication().getPrincipal();
    return userDetails.getUsername();
}

刚登录时工作正常,但是当转到不同的页面时,上下文变为 org.springframework.security.core.context.SecurityContextImpl@ffffffff: Nullauthentication with authentification = null

如何在 Spring Boot 中正确检索使用 Spring Security 登录的用户?

Spring Boot版本是2.0.3.RELEASE。

更新:
澄清一下:导航到另一个页面后,SecurityContextHolder.getContext() 会提供一个 authentification = null 的上下文。因此,context.getAuthentication().getPrincipal() 会抛出 NullPointerException,因为 context.getAuthentication() 为 null。

最佳答案

不知道出了什么问题,但我找到了一个解决方法 - 我在 session 中保存用户名。 由于我使用 Vaadin - 我使用 VaadinSession,但我相信 HttpSession 也可以使用。

public static String getUsername() {
  VaadinSession session = VaadinSession.getCurrent();
  if(session.getAttribute("username") == null) {
    SecurityContext context = SecurityContextHolder.getContext();
    UserDetails userDetails = (UserDetails) context.getAuthentication().getPrincipal();
    session.setAttribute("username", userDetails.getUsername());
  }
  return (String) session.getAttribute("username");
}

唯一的事情 - 该代码仅在组件中有效,因此您必须确保从 Autowiring 类中使用它。

关于java - Spring Security 在 Spring Boot 中检索用户名时提供 Null 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52604033/

相关文章:

java - libgdx getHeight() 不覆盖整个屏幕

java - 重新启动服务器,为什么我的客户端无法连接到我的 mysql 数据库?获取 java.net.ConnectException

java - 如何使用 Elastic 对最后的 Null 进行排序?

java - 为什么请求会发送到 Struts Dispatcher?

java - 为带注释的 MyBatis 插入指定类型处理程序

java - 使用 @Timed 注释对方法进行计时 - 与输入大小相关

java - 如何实现代理服务器?

java - 是否有任何 java/spring 方法可以使用 HttpServletRequest 存储当前登录用户的 session 信息?

java - 要下载哪个 Jetty 发行版才能运行完整的 Spring3.0 应用程序?

java - 无法从 JSON 转换;意外字符 ('f'(代码 102)): Expected space separating root-level values at (String )"5f19a7e99933db43cb23e83d"