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

Тази статия е част от поредица: • Урок за пролетна регистрация на сигурността

• Процесът на регистрация с пролетна сигурност

• Регистрация - Активирайте нов акаунт по имейл

• Пролетна регистрация на сигурността - Изпратете отново имейл за потвърждение

• Регистрация с Spring Security - Кодиране на парола (текуща статия) • API за регистрация става RESTful

• Spring Security - Нулирайте паролата си

• Регистрация - Сила и правила на паролата

• Актуализиране на вашата парола

1. Общ преглед

Тази статия разглежда критична част от процеса на регистрация - кодиране на парола - основно не съхраняване на паролата в открит текст.

Има няколко механизма за кодиране, поддържани от Spring Security - и за статията ще използваме BCrypt , тъй като обикновено това е най-доброто решение.

Повечето от другите механизми, като MD5PasswordEncoder и ShaPasswordEncoder, използват по-слаби алгоритми и вече са оттеглени.

2. Определете кодера за парола

Ще започнем с дефинирането на простия BCryptPasswordEncoder като боб в нашата конфигурация:

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

По-старите внедрения - като SHAPasswordEncoder - ще изискват от клиента да предаде стойност на солта, когато кодира паролата.

BCrypt обаче ще генерира вътрешно произволна сол вместо това. Това е важно да се разбере, защото това означава, че всяко обаждане ще има различен резултат и затова трябва да кодираме паролата само веднъж.

За да работи това произволно генериране на сол, BCrypt ще съхранява солта в самата хеш стойност. Например в следната хеш стойност:

$2a$10$ZLhnHxdpHETcxmtEStgpI./Ri1mksgJ9iDP36FmfMdYyVg9g0b2dq

Има три полета, разделени с $:

  1. В "2а" представлява BCrypt алгоритъм версия
  2. В "10" представлява силата на алгоритъма
  3. В "ZLhnHxdpHETcxmtEStgpI". част всъщност е произволно генерираната сол. По принцип първите 22 знака са сол. Останалата част от последното поле е действителната хеширана версия на обикновения текст

Също така имайте предвид, че алгоритъмът BCrypt генерира низ с дължина 60, така че трябва да се уверим, че паролата ще се съхранява в колона, която може да я побере. Често срещана грешка е да се създаде колона с различна дължина и след това да се получи грешка с невалидно потребителско име или парола по време на удостоверяване.

3. Кодирайте паролата при регистрация

Сега ще използваме PasswordEncoder в нашата UserService, за да хешираме паролата по време на процеса на регистрация на потребителя:

Пример 3.1. - UserServic 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.

Най- пълното прилагане на тази регистрация с Пролет сигурност урок може да се намери повече от GitHub.

Напред » API за регистрация става RESTful « Предишна пролетна регистрация за сигурност - Изпратете отново имейл за потвърждение