Spring security 未在HttpSession中持久化Spring安全自动登录
下面的代码创建了一个Spring身份验证对象,该对象的角色_user与我查看SecurityContext context=SecurityContextHolder.getContext()时的角色关联;最后,它确实有一个角色_USER和一个UserDetails主体,因此不知何故,它没有与我的HttpSession关联。有什么想法吗?我的例外情况也在下面Spring security 未在HttpSession中持久化Spring安全自动登录,spring-security,Spring Security,下面的代码创建了一个Spring身份验证对象,该对象的角色_user与我查看SecurityContext context=SecurityContextHolder.getContext()时的角色关联;最后,它确实有一个角色_USER和一个UserDetails主体,因此不知何故,它没有与我的HttpSession关联。有什么想法吗?我的例外情况也在下面 public String login(){ if(signUpDetailBean.getEmail() != null){
public String login(){
if(signUpDetailBean.getEmail() != null){
sers currentUser = userManager.getUser(signUpDetailBean.getEmail());
authenticateUserAndSetSession(currentUser, (HttpServletRequest) FacesUtils.getExternalContext().getRequest());
clearForm();
return "/registered/home.html";
}else{
clearForm();
return "/auth/login.html";
}
}
private void authenticateUserAndSetSession(Users user, HttpServletRequest request)
{
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
user.getUsername(), user.getPassword());
// generate session if one doesn't exist
request.getSession();
token.setDetails(new WebAuthenticationDetails(request));
Authentication authenticatedUser = authenticationManager.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
SecurityContext context = SecurityContextHolder.getContext();
}
我们需要在会话中设置安全上下文。否则就不行了。你可以用这个
SecurityContextHolder.getContext().setAuthentication(authentication);
request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());
在一个应用程序中,在成功登录和来自AuthenticationSuccessHandler的重定向之间,我丢失了登录凭据,但在另一个应用程序中,我没有丢失,而另一个应用程序基本上做了相同的事情 您可以这样尝试重定向:返回“redirect:CONTEXT-PATH/registered/home.html”;用上下文替换CONTEXT-PATH。@Ritesh我也尝试了重定向,但遇到了同样的问题。我从重定向发生的位置添加了整个日志。我有身份验证auth=SecurityContextHolder.getContext().getAuthentication();就在重定向和用户角色出现之前,主体对象是正确的。在重定向或post之后,似乎没有将对象保持在会话中…有什么想法吗?Ritesh,我还尝试创建了一个RememberMetauthenticationToken,而不是我正在使用的UsernamePasswordAuthenticationToken,但我没有找到org.springframework.security.authentication.RememberMetauthenticationToken的AuthenticationProvider,当我这样做时…你在哪里添加这些行?请解释你的答案请解释添加到哪里。请张贴完整的答案。
SecurityContextHolder.getContext().setAuthentication(authentication);
request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());