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){ Listprivileges = 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 .