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 – перенос паролей
В документации Spring Security 5 предлагается обработать это исключение, используя:
DelegatingPasswordEncoder.setDefaultPasswordEncoderForMatches(PasswordEncoder)
Если это исправление, то куда мне его поместить? Я пытался поместить его в компонент PasswordEncoder, как показано ниже, но это не сработало:
Код: Выделить всё
DelegatingPasswordEncoder def = new DelegatingPasswordEncoder(idForEncode, encoders);
def.setDefaultPasswordEncoderForMatches(passwordEncoder);
Код: Выделить всё
@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();
}
}
Код: Выделить всё
@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);
}
}