Spring Security 5: «Для идентификатора «null» не отображается парольный кодировщик»JAVA

Программисты JAVA общаются здесь
Anonymous
Spring Security 5: «Для идентификатора «null» не отображается парольный кодировщик»

Сообщение Anonymous »

Я перехожу с Spring Boot 1.4.9 на Spring Boot 2.0, а также на Spring Security 5 и пытаюсь выполнить аутентификацию через OAuth 2. Но я получаю эту ошибку:

java.lang.IllegalArgumentException: для идентификатора "null" не сопоставлено значение PasswordEncoder

Из документации Spring Security 5, я узнаю, что
формат хранения пароля изменен.
В моем текущем коде я создал свой bean-код кодировщика паролей как:

Код: Выделить всё

@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
Однако возникла следующая ошибка:

Закодированный пароль не похож на BCrypt

Поэтому я обновил кодировщик в соответствии с документом Spring Security 5, чтобы:

Код: Выделить всё

@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
Теперь, если я вижу пароль в базе данных, он сохраняется как:

Код: Выделить всё

{bcrypt}$2a$10$LoV/3z36G86x6Gn101aekuz3q9d7yfBp3jFn7dzNN/AL5630FyUQ
Когда эта первая ошибка исчезла, и теперь, когда я пытаюсь выполнить аутентификацию, я получаю следующую ошибку:

java.lang.IllegalArgumentException: для идентификатора "null" не сопоставлено PasswordEncoder.

Чтобы решить эту проблему, я попробовал все приведенные ниже вопросы из Stack Overflow:
  • Как указать PasswordEncoder в Spring Boot?
  • Spring Oauth2. Кодировщик пароля не установлен в DaoAuthenticationProvider
Вот вопрос, похожий на мой, но без ответа:
  • Spring Security 5 – перенос паролей
Примечание. Я уже храню зашифрованный пароль в базе данных, поэтому нет необходимости повторно кодировать его в UserDetailsService.
В документации Spring Security 5 предлагается обработать это исключение, используя:


DelegatingPasswordEncoder.setDefaultPasswordEncoderForMatches(PasswordEncoder)
Если это исправление, то куда мне его поместить? Я пытался поместить его в компонент PasswordEncoder, как показано ниже, но это не сработало:

Код: Выделить всё

DelegatingPasswordEncoder def = new DelegatingPasswordEncoder(idForEncode, encoders);
def.setDefaultPasswordEncoderForMatches(passwordEncoder);
Класс MyWebSecurity

Код: Выделить всё

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsService userDetailsService;

@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}

@Override
public void configure(WebSecurity web) throws Exception {

web
.ignoring()
.antMatchers(HttpMethod.OPTIONS)
.antMatchers("/api/user/add");
}

@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
Конфигурация MyOauth2

Код: Выделить всё

@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

@Bean
public TokenStore tokenStore() {
return new InMemoryTokenStore();
}

@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;

@Bean
public TokenEnhancer tokenEnhancer() {
return new CustomTokenEnhancer();
}

@Bean
public DefaultAccessTokenConverter accessTokenConverter() {
return new DefaultAccessTokenConverter();
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
throws Exception {
endpoints
.tokenStore(tokenStore())
.tokenEnhancer(tokenEnhancer())
.accessTokenConverter(accessTokenConverter())
.authenticationManager(authenticationManager);
}

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients
.inMemory()
.withClient("test")
.scopes("read", "write")
.authorities(Roles.ADMIN.name(), Roles.USER.name())
.authorizedGrantTypes("password", "refresh_token")
.secret("secret")
.accessTokenValiditySeconds(1800);
}
}
Пожалуйста, помогите мне разобраться с этой проблемой. Я потратил часы, чтобы это исправить, но мне не удалось это исправить.

Вернуться в «JAVA»