Регистрация в Spring Security - Кодировка пароля

Регистрация в Spring Security - кодировка пароля

1. обзор

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

Spring Security поддерживает несколько механизмов кодирования - и для статьиwe’ll use BCrypt, поскольку это обычно лучшее решение.

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

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

Хранение нового пароля в Spring Security 5

Краткое руководство по пониманию шифрования паролей в Spring Security 5 и переходу к лучшим алгоритмам шифрования.

Read more

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

Узнайте, как разрешить пользователям проходить проверку подлинности только в принятых местах с помощью Spring Security.

Read more

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

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

Read more

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, поэтому его должно быть легко импортировать и запускать как есть.