弹簧安全自动登录

Cli*_*sch 5 java servlets spring-security

我有一个使用spring-security的应用程序.在我的注册过程中,新的用户实体将使用HASHED密码保留,包含激活令牌的电子邮件将发送给用户.单击此标记会将用户定向到UserActivationServlet,UserActivationServlet通过令牌查找用户,激活用户并将其重定向到应用程序.我想自动将用户登录到应用程序中,并在我的servlet中包含此方法来执行此操作

    private void authenticateUserAndSetSession(HttpServletRequest request, User u) {
    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
            u.getUsername(), u.getPassword()); //PROBLEM: THIS PASSWORD IS HASHED

    // generate session if one doesn't exist
    request.getSession();

    token.setDetails(new WebAuthenticationDetails(request));
    Authentication authenticatedUser = authenticationManager.authenticate(token);

    SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
    request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY,
            SecurityContextHolder.getContext());
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是User实体上的密码字段在创建时已经过哈希处理.所以我能想到的唯一其他选择是将未散列的密码作为请求参数传递给servelet(讨厌!)

我是否遗漏了某些内容,是否有另一种预先验证用户的方法?

谢谢

Cli*_*sch 3

用户已单击激活链接,并且我们已经查找了他,所以很明显我们有一个有效的用户,因此无需使用 重新对他进行身份验证authenticationManager,因此在创建令牌时无需使用凭据,只需将其创建为如下:

PreAuthenticatedAuthenticationToken token = new PreAuthenticatedAuthenticationToken( p, null, p.getAuthorities());
Run Code Online (Sandbox Code Playgroud)