Кодер на парола по подразбиране в Spring Security 5

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

В Spring Security 4 беше възможно да се съхраняват пароли в обикновен текст, използвайки удостоверяване в паметта.

Основен ремонт на процеса на управление на паролите във версия 5 въведе по-сигурен механизъм по подразбиране за кодиране и декодиране на пароли. Това означава, че ако вашето приложение Spring съхранява пароли в обикновен текст, надстройването до Spring Security 5 може да доведе до проблеми.

В този кратък урок ще опишем един от тези потенциални проблеми и ще покажем решение.

2. Пролетна сигурност 4

Ще започнем, като покажем стандартна конфигурация за защита, която осигурява просто удостоверяване в паметта (важи за Spring 4):

@Configuration public class InMemoryAuthWebSecurityConfigurer extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("spring") .password("secret") .roles("USER"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/private/**") .authenticated() .antMatchers("/public/**") .permitAll() .and() .httpBasic(); } } 

Тази конфигурация дефинира удостоверяване за всички / частни / картографирани методи и публичен достъп за всичко под / public /.

Ако използваме същата конфигурация под Spring Security 5, ще получим следната грешка:

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"

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

3. Пролетна сигурност 5

Можем да поправим тази грешка, като дефинираме делегиране на PasswordEncoder с класа PasswordEncoderFactories .

Използваме този енкодер, за да конфигурираме нашия потребител с AuthenticationManagerBuilder:

@Configuration public class InMemoryAuthWebSecurityConfigurer extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder(); auth.inMemoryAuthentication() .withUser("spring") .password(encoder.encode("secret")) .roles("USER"); } } 

Сега, с тази конфигурация, съхраняваме нашата парола в паметта с помощта на BCrypt в следния формат:

{bcrypt}$2a$10$MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS 

Въпреки че можем да дефинираме собствения си набор от кодери за пароли, препоръчително е да се придържате към кодерите по подразбиране, предоставени в PasswordEncoderFactories .

3.2. NoOpPasswordEncoder

Ако по някаква причина не искаме да кодираме конфигурираната парола, можем да използваме NoOpPasswordEncoder .

За да направите това, ние просто добавяме паролата, която предоставяме, към метода password () с идентификатора {noop} :

@Configuration public class InMemoryNoOpAuthWebSecurityConfigurer extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("spring") .password("{noop}secret") .roles("USER"); } } 

По този начин Spring Security ще използва NoOpPasswordEncoder под капака, когато сравнява паролата, предоставена от потребителя, с тази, която сме конфигурирали по-горе.

Имайте предвид обаче, че никога не трябва да използваме този подход в производственото приложение! Както се казва в официалната документация, NoOpPasswordEncoder е остарял, за да покаже, че е наследствено изпълнение и използването му се счита за несигурно .

3.3. Мигриране на съществуващи пароли

Можем да актуализираме съществуващите пароли до препоръчаните стандарти Spring Security 5 чрез:

  • Актуализиране на съхранени пароли с обикновен текст с кодирана стойност:
String encoded = new BCryptPasswordEncoder().encode(plainTextPassword); 
  • Префикс на хешираните съхранени пароли с техния известен идентификатор на кодера:
{bcrypt}$2a$10$MF7hYnWLeLT66gNccBgxaONZHbrSMjlUofkp50sSpBw2PJjUqU.zS {sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0 
  • Искане от потребители да актуализират своите пароли, когато механизмът за кодиране на съхранените пароли е неизвестен

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

В този бърз пример актуализирахме валидна конфигурация за удостоверяване в паметта Spring 4 до Spring 5, използвайки новия механизъм за съхранение на пароли.

Както винаги, можете да намерите изходния код в проекта GitHub.