Spring Security - 注册后自动登录用户

2023/05/17

1. 概述

在本快速教程中,我们将讨论如何在注册过程后立即对用户进行自动身份验证-在Spring Security实现中。

简而言之,一旦用户完成注册,他们通常会被重定向到登录页面,现在必须重新输入他们的用户名和密码。

让我们看看如何通过自动验证用户来避免这种情况。

2. 使用HttpServletRequest

以编程方式强制进行身份验证的一种非常简单的方法是利用HttpServletRequest login()方法:

public void authWithHttpServletRequest(HttpServletRequest request, String username, String password) {
    try {
        request.login(username, password);
    } catch (ServletException e) {
        LOGGER.error("Error while login ", e);
    }
}

现在,在幕后,HttpServletRequest.login() API确实使用AuthenticationManager来执行身份验证。

了解和处理可能在此级别发生的ServletException也很重要。

3. 使用AuthenticationManager

接下来,我们也可以直接创建一个UsernamePasswordAuthenticationToken-然后手动通过标准的AuthenticationManager:

public void authWithAuthManager(HttpServletRequest request, String username, String password) {
    UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(username, password);
    authToken.setDetails(new WebAuthenticationDetails(request));
    
    Authentication authentication = authenticationManager.authenticate(authToken);
    
    SecurityContextHolder.getContext().setAuthentication(authentication);
}

请注意我们如何创建令牌请求,将其传递给标准身份验证流程,然后在当前安全上下文中显式设置结果。

4. 复杂注册

在某些更复杂的场景中,注册过程有多个阶段,例如-用户可以登录系统之前的确认步骤。

在这种情况下,准确了解我们可以在何处对用户进行自动身份验证当然很重要。我们不能在他们注册后立即执行此操作,因为此时新创建的帐户仍处于禁用状态。

简而言之-我们必须在他们确认他们的帐户后执行自动身份验证

另外,请记住,在这一点上-我们无法再访问他们实际的、原始的凭据。我们只能访问用户的编码密码,这就是我们将在这里使用的:

public void authWithoutPassword(User user){
    List<Privilege> privileges = user.getRoles().stream().map(Role::getPrivileges)
        .flatMap(Collection::stream).distinct().collect(Collectors.toList());
    List<GrantedAuthority> authorities = privileges.stream()
        .map(p -> new SimpleGrantedAuthority(p.getName()))
        .collect(Collectors.toList());

    Authentication authentication = new UsernamePasswordAuthenticationToken(user, null, authorities);
    SecurityContextHolder.getContext().setAuthentication(authentication);
}

请注意我们如何在此处正确设置身份验证权限,这通常是在AuthenticationProvider中完成的。

5. 总结

我们讨论了在注册过程后自动验证用户的不同方法。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章