Spring Security - автоматический вход пользователя после регистрации

Spring Security - автоматический вход пользователя после регистрации

1. обзор

В этом кратком руководстве мы обсудим, как автоматически аутентифицировать пользователей сразу после процесса регистрации - в реализации Spring Security.

Проще говоря, как только пользователь завершает регистрацию, он обычно перенаправляется на страницу входа и теперь должен повторно ввести свое имя пользователя и пароль.

Давайте посмотрим, как этого избежать, вместо этого автоматически аутентифицируя пользователя.

Прежде чем мы начнем, обратите внимание, что мы работаем в рамкахregistration series здесь, на сайте.

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);
    }
}

Теперь, когда под капотом APIHttpServletRequest.login() действительно использует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. Комплексная регистрация

В некоторых более сложных сценариях процесс регистрации состоит из нескольких этапов, таких как, например, этап подтверждения, пока пользователь не сможет войти в систему.

В таких случаях, конечно, важно точно понимать, где мы можем выполнить автоматическую аутентификацию пользователя. Мы не можем сделать это сразу после их регистрации, потому что в этот момент вновь созданная учетная запись по-прежнему отключена.

Проще говоря -we have to perform the automatic authentication after they confirm their account.

Кроме того, имейте в виду, что в этот момент у нас больше нет доступа к их фактическим, необработанным учетным данным. У нас есть доступ только к закодированному паролю пользователя - вот что мы будем использовать здесь:

public void authWithoutPassword(User user){
    List privileges = user.getRoles().stream()
      .map(role -> role.getPrivileges())
      .flatMap(list -> list.stream())
      .distinct().collect(Collectors.toList());
    List 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. Заключение

Мы обсудили различные способы автоматической аутентификации пользователей после процесса регистрации.

Как всегда, доступен полный исходный кодover on GitHub.