我尝试像这样获取用户名:
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/