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

Регистрация с помощью Spring Security – Кодирование пароля

Как кодировать пароль при регистрации (и аутентификации) нового пользователя – с помощью Spring Security и BCrypt.

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

1. Обзор

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

Существует несколько механизмов кодирования, поддерживаемых Spring Security – и для этой статьи мы будем использовать BCrypt , так как это обычно лучшее доступное решение.

Большинство других механизмов, таких как MD5PasswordEncoder и ShaPasswordEncoder , используют более слабые алгоритмы и теперь устарели.

Дальнейшее чтение:

Новое Хранилище Паролей В Spring Security 5

Разрешить аутентификацию из принятых местоположений только с помощью Spring Security

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

2. Определите Кодировщик паролей

Мы начнем с определения простого BCryptPasswordEncoder в качестве компонента в нашей конфигурации:

@Bean
public PasswordEncoder encoder() {
    return new BCryptPasswordEncoder();
}

Более старые реализации, такие как ShaPasswordEncoder , потребовали бы, чтобы клиент передавал значение соли при кодировании пароля.

BCrypt, однако, будет внутренне генерировать случайную соль вместо этого. Это важно понимать, потому что это означает, что каждый вызов будет иметь другой результат, и поэтому нам нужно только один раз закодировать пароль.

Чтобы эта случайная генерация соли работала, BCrypt будет хранить соль внутри самого хэш-значения. Например, в следующем хэш-значении:

$2a$10$ZLhnHxdpHETcxmtEStgpI./Ri1mksgJ9iDP36FmfMdYyVg9g0b2dq

Есть три поля, разделенные $:

  1. “2a” представляет версию алгоритма BCrypt
  2. “10” представляет силу алгоритма
  3. “ZLhnHxdpHETcxmtEStgpI.” часть на самом деле является случайно сгенерированной солью. В основном, первые 22 символа-это соль. Оставшаяся часть последнего поля-это фактическая хэшированная версия обычного текста

Кроме того, имейте в виду, что алгоритм BCrypt генерирует строку длиной 60, поэтому нам нужно убедиться, что пароль будет храниться в столбце, который может его вместить. Распространенной ошибкой является создание столбца другой длины, а затем получение Недопустимого имени пользователя или пароля ошибка во время аутентификации.

3. Закодируйте Пароль при регистрации

Теперь мы будем использовать PasswordEncoder в нашем Пользовательском сервисе для хэширования пароля во время процесса регистрации пользователя:

Пример 3.1. – Обслуживание пользователей e Хэширует пароль

@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. Закодируйте пароль при аутентификации

Теперь давайте рассмотрим другую половину этого процесса и закодируем пароль, когда пользователь аутентифицируется.

Во-первых, нам нужно ввести компонент кодировщика паролей, который мы определили ранее, в наш поставщик аутентификации:

@Autowired
private UserDetailsService userDetailsService;

@Bean
public DaoAuthenticationProvider authProvider() {
    DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
    authProvider.setUserDetailsService(userDetailsService);
    authProvider.setPasswordEncoder(encoder());
    return authProvider;
}

Конфигурация безопасности проста:

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

И, наконец, нам нужно ссылаться на этого поставщика аутентификации в нашей конфигурации XML безопасности:


    

Или, в случае, если вы используете конфигурацию Java:

@Configuration
@ComponentScan(basePackages = { "com.baeldung.security" })
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authProvider());
    }
    
    ...
}

5. Заключение

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

полную реализацию этой регистрации с помощью руководства по безопасности Spring можно найти на GitHub .