在我的项目中,我有2个模块:一个用于登录,另一个用于注册新用户。
如果用户已经存在,我使用Spring Security开发的登录模块工作正常,即登录后,用户ID将UserPrincipal
存储到HttpServletRequest
对象中。
为了注册新用户,我首先在数据库中输入,然后尝试使用Spring Security进行身份验证,我编写以下代码来执行此操作并且工作正常。
段:
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities());
authMgr.authenticate(auth);
SecurityContextHolder.getContext().setAuthentication(auth);
问题是我未在UserPrincipal
中获得HttpServletRequest
。
所以在调用setAuthentication(auth)
之后,我调用request.getuserprincipal()
并返回null。
答案 0 :(得分:0)
使用以下代码行,我认为这会对您有所帮助:
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, udetail.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
Principal principal = request.getUserPrincipal();
答案 1 :(得分:0)
问题解决了,代码完全相同,除了我必须重定向请求以在请求中添加UserPrincipal。令人惊讶的是,尽管在web.xml中为spring过滤器添加了前向调度程序,但request.forward仍无法正常工作。
答案 2 :(得分:0)
可能就在该行之后:SecurityContextHolder.getContext()。setAuthentication(auth);
我想补充一下: request.getSession()。setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY,SecurityContextHolder.getContext());
否则,用户将无法进入Spring Security所需的会话中。