Рубрики
Без рубрики

Spring Security – Автоматический Вход Пользователя В Систему После Регистрации

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

Автор оригинала: baeldung.

1. Обзор

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

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

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

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

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 использует Диспетчер аутентификации для выполнения аутентификации.

Также важно понять и разобраться с исключением ServletException , которое может возникнуть на этом уровне.

3. Использование диспетчера аутентификации

Затем мы также можем напрямую создать 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 privileges = user.getRoles().stream().map(Role::getPrivileges)
      .flatMap(Collection::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. Заключение

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

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