Регистрация в Spring Security - кодировка пароля
1. обзор
В этой статье обсуждается важная часть процесса регистрации -password encoding - по сути, отсутствие хранения пароля в виде открытого текста.
Spring Security поддерживает несколько механизмов кодирования - и для статьиwe’ll use BCrypt, поскольку это обычно лучшее решение.
Большинство других механизмов, таких какMD5PasswordEncoder иShaPasswordEncoder, используют более слабые алгоритмы и в настоящее время не рекомендуются.
Дальнейшее чтение:
Хранение нового пароля в Spring Security 5
Краткое руководство по пониманию шифрования паролей в Spring Security 5 и переходу к лучшим алгоритмам шифрования.
Разрешить проверку подлинности только в принятых местах с помощью Spring Security
Узнайте, как разрешить пользователям проходить проверку подлинности только в принятых местах с помощью Spring Security.
Spring Security - автоматический вход пользователя после регистрации
Узнайте, как быстро выполнить автоматическую аутентификацию пользователя после завершения процесса регистрации.
2. Определите кодировщик паролей
Мы начнем с определения простого BCryptPasswordEncoder как bean-компонента в нашей конфигурации:
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
В более старых реализациях, таких какSHAPasswordEncoder, от клиента требовалось передать значение соли при кодировании пароля.
BCrypt, однако, вместо этогоwill internally generate a random salt. Это важно понимать, потому что это означает, что каждый вызов будет иметь разный результат, и поэтому нам нужно только один раз кодировать пароль.
Также имейте в виду, что алгоритмBCrypt генерирует строку длиной 60, поэтому нам нужно убедиться, что пароль будет сохранен в столбце, который может его вместить. Распространенная ошибка - создать столбец другой длины, а затем получить ошибкуInvalid Username or Password во время аутентификации.
3. Закодируйте пароль при регистрации
Теперь мы будем использоватьPasswordEncoder в нашемUserService для хеширования пароля во время процесса регистрации пользователя:
Пример 3.1. -UserService хеширует пароль
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public User registerNewUserAccount(UserDto accountDto) throws EmailExistsException {
if (emailExist(accountDto.getEmail())) {
throw new EmailExistsException(
"There is an account with that email adress:" + accountDto.getEmail());
}
User user = new User();
user.setFirstName(accountDto.getFirstName());
user.setLastName(accountDto.getLastName());
user.setPassword(passwordEncoder.encode(accountDto.getPassword()));
user.setEmail(accountDto.getEmail());
user.setRole(new Role(Integer.valueOf(1), user));
return repository.save(user);
}
4. Закодируйте пароль при аутентификации
Теперь займемся второй половиной этого процесса и закодируем пароль при аутентификации пользователя.
Во-первых, нам нужно внедрить bean-компонент кодировщика паролей, который мы определили ранее, в наш поставщик аутентификации:
@Autowired
private UserDetailsService userDetailsService;
@Bean
public DaoAuthenticationProvider authProvider() {
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
authProvider.setUserDetailsService(userDetailsService);
authProvider.setPasswordEncoder(encoder());
return authProvider;
}
Конфигурация безопасности проста:
-
мы внедряем нашу реализацию сервиса пользовательских данных
-
мы определяем провайдера аутентификации, который ссылается на наш сервис данных
-
мы также включаем кодировщик паролей
И, наконец, нам нужноreference this auth provider в нашей конфигурации XML безопасности:
Или, если вы используете конфигурацию Java:
@Configuration
@ComponentScan(basePackages = { "org.example.security" })
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authProvider());
}
...
}
5. Заключение
Это краткое руководство продолжает серию «Регистрация», показывая, как правильно хранить пароль в базе данных, используя простую, но очень мощную реализацию BCrypt.
full implementation этого руководства по регистрации с помощью Spring Security можно найти вthe GitHub project - это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть.