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

时间:2018-10-02 07:48:52

标签: 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: Null authenticationauthentification = null

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

Spring Boot版本是2.0.3.RELEASE。

UPD:
需要说明的是:导航到另一页后,SecurityContextHolder.getContext()给出了一个authentification = null的上下文。因此context.getAuthentication().getPrincipal()会抛出NullPointerException,因为context.getAuthentication()为空。

1 个答案:

答案 0 :(得分:0)

不知道出了什么问题,但是我找到了一种解决方法-我在会话中保存了用户名。 由于我使用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");
}

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