Saya bermigrasi dari Spring Boot 1.4.9 ke Spring Boot 2.0 dan juga ke Spring Security 5 dan saya mencoba melakukan otentikasi melalui OAuth 2. Tetapi saya mendapatkan kesalahan ini:
java.lang.IllegalArgumentException: Tidak ada PasswordEncoder yang dipetakan untuk id "null
Dari dokumentasi Spring Keamanan 5, Saya mengetahui bahwa format penyimpanan untuk kata sandi diubah.
Dalam kode saya saat ini, saya telah membuat kacang encoder kata sandi sebagai:
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
Namun itu memberi saya kesalahan di bawah ini:
Sandi yang dikodekan tidak terlihat seperti BCrypt
Jadi saya memperbarui encoder sesuai Spring Security 5 ke:
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
Sekarang jika saya dapat melihat kata sandi di database, ia disimpan sebagai
{bcrypt}$2a$10$LoV/3z36G86x6Gn101aekuz3q9d7yfBp3jFn7dzNN/AL5630FyUQ
Dengan hilangnya kesalahan pertama dan sekarang ketika saya mencoba melakukan otentikasi saya mendapatkan kesalahan di bawah ini:
java.lang.IllegalArgumentException: Tidak ada PasswordEncoder yang dipetakan untuk id "null
Untuk mengatasi masalah ini saya mencoba semua pertanyaan di bawah ini dari Stackoverflow:
Ini pertanyaan yang mirip dengan saya tetapi belum terjawab:
CATATAN: Saya sudah menyimpan kata sandi terenkripsi di database jadi tidak perlu menyandikan lagi di UserDetailsService
.
Di Keamanan musim semi 5 dokumentasi mereka menyarankan Anda dapat menangani pengecualian ini menggunakan:
MendelegasikanPasswordEncoder.setDefaultPasswordEncoderForMatches(PasswordEncoder)
Jika ini perbaikannya, lalu di mana saya harus meletakkannya? Saya telah mencoba memasukkannya ke dalam PasswordEncoder
bean seperti di bawah ini tetapi tidak berhasil:
DelegatingPasswordEncoder def = new DelegatingPasswordEncoder(idForEncode, encoders);
def.setDefaultPasswordEncoderForMatches(passwordEncoder);
Kelas Keamanan Web Saya
@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();
}
}
Konfigurasi 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);
}
}
Tolong bimbing saya dengan masalah ini. Saya telah menghabiskan waktu berjam-jam untuk memperbaikinya tetapi tidak dapat memperbaikinya.
passwordEncoder
padaClientDetailsServiceConfigurer
atau awali rahasianya dengan {noop}. Harapan itu masuk akal dan membantu seseorang. - person KellyM   schedule 06.04.2018mvn clean package
. Pasti ada masalah dengan cache. - person Janac Meena   schedule 26.02.2021