ฉันกำลังย้ายจาก Spring Boot 1.4.9 เป็น Spring Boot 2.0 และไปยัง Spring Security 5 และฉันกำลังพยายามตรวจสอบสิทธิ์ผ่าน OAuth 2 แต่ฉันได้รับข้อผิดพลาดนี้:
java.lang.IllegalArgumentException: ไม่มี PasswordEncoder ที่แมปสำหรับ id "null
จากเอกสารประกอบของ Spring ความปลอดภัย 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: ไม่มี PasswordEncoder ที่แมปสำหรับ id "null
เพื่อแก้ไขปัญหานี้ ฉันลองคำถามด้านล่างทั้งหมดจาก Stackoverflow:
นี่เป็นคำถามที่คล้ายกับของฉันแต่ไม่ได้รับคำตอบ:
หมายเหตุ: ฉันกำลังจัดเก็บรหัสผ่านที่เข้ารหัสไว้ในฐานข้อมูลอยู่แล้ว ดังนั้นจึงไม่จำเป็นต้องเข้ารหัสอีกครั้งใน UserDetailsService
ในSpring security 5 เอกสารที่พวกเขาแนะนำให้คุณจัดการข้อยกเว้นนี้ได้โดยใช้:
การมอบหมายรหัสผ่านEncoder.setDefaultPasswordEncoderForMatches (PasswordEncoder)
ถ้านี่คือการแก้ไขแล้วฉันควรวางไว้ที่ไหน? ฉันได้ลองใส่มันใน PasswordEncoder
bean เหมือนด้านล่าง แต่มันไม่ทำงาน:
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);
}
}
โปรดแนะนำฉันเกี่ยวกับปัญหานี้ ฉันใช้เวลาหลายชั่วโมงในการแก้ไขปัญหานี้ แต่ไม่สามารถแก้ไขได้
passwordEncoder
บนClientDetailsServiceConfigurer
หรือนำหน้าข้อมูลลับด้วย {noop} หวังว่าจะสมเหตุสมผลและช่วยเหลือใครสักคน - person KellyM   schedule 06.04.2018mvn clean package
คงมีปัญหาบางอย่างกับการแคช - person Janac Meena   schedule 26.02.2021