我尝试这样获得用户名:
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 authentication
和authentification = null
。
如何在Spring Boot中正确检索使用Spring Security的登录用户?
Spring Boot版本是2.0.3.RELEASE。
UPD:
需要说明的是:导航到另一页后,SecurityContextHolder.getContext()
给出了一个authentification = null
的上下文。因此context.getAuthentication().getPrincipal()
会抛出NullPointerException
,因为context.getAuthentication()
为空。
答案 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");
}
唯一的事情-此代码仅在组件中有效,因此您必须确保从自动装配的类中使用它。