Frühjahr Oauth2. Passwort-encoder ist nicht DaoAuthenticationProvider
Ich bin ganz neu auf den Frühling Oauth und Spring Security. Ich versuche, die client_credentials fließen in mein Projekt. Jetzt habe ich es geschafft Benutzer meine eigenen CustomDetailsService, um zu Holen, client_id und Passwort (secret) aus einer Datenbank, die bereits in meinem system. Das problem ist nur, dass ich nicht ändern kann den Passwort-encoder in DaoAuthenticationProvider, die von AuthorizationServer - es standardmäßig so eingestellt ist, PlaintextPasswordEncoder. Ich war nicht in der Lage, es so konfigurieren, dass es zum Beispiel SHAPasswordEncoder. Er verwendet immer den Klartext-encoder. Ich wahrscheinlich gar nicht verstehen, der flow gut genug, wie ich bin ein Neuling im Frühjahr.
Hier ist etwas code von mir (mit nicht funktionierenden Konfiguration der DaoAuthenticationProvider):
SecurityConfig.java
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private static final String RESOURCE_ID = "restservice";
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/register/**");
}
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(daoAuthenticationProvider());
}
@Bean
public DaoAuthenticationProvider daoAuthenticationProvider() {
DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
daoAuthenticationProvider.setUserDetailsService(userDetailsService());
daoAuthenticationProvider.setPasswordEncoder(passwordEncoder());
return daoAuthenticationProvider;
}
@Bean
public PasswordEncoder passwordEncoder() {
return new ShaPasswordEncoder();
}
@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
@Autowired
private MyCustomClientDetailsService myCustomClientDetailsService;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
throws Exception {
endpoints.tokenStore(tokenStore());
}
@Bean
public ResourceServerTokenServices defaultTokenServices() {
final DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setSupportRefreshToken(true);
defaultTokenServices.setTokenStore(tokenStore());
return defaultTokenServices;
}
@Bean
public TokenStore tokenStore() {
return new InMemoryTokenStore();
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.withClientDetails(myCustomClientDetailsService);
}
@Bean
public MyCustomClientDetailsService detailsService() {
return new MyCustomClientDetailsService();
}
}
@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
...
}
}
- Und custom-ClientDetailsService Klasse:
public class MyCustomClientDetailsService implements ClientDetailsService {
@Autowired
private UserService userService;
@Override
public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
User fan = userService.getFan(clientId);
if (fan == null) {
throw new NoSuchClientException("No client with requested id: " + clientId);
}
BaseClientDetails details = new BaseClientDetails(clientId, restservice, "write", "client_credentials", "USER");
details.setClientSecret(fan.getEncodedPassword());
return details;
}
}
Den encodedPassword, dass ist aus meiner UserService ist immer ein schlechtes Berechtigung, als DaoAuthenticationProvider hat eine PlaintextPasswordEncoder standardmäßig festgelegt.
Was bin ich dort?
Ist es möglich, den Passwort-encoder in der DaoAuthenticationProvider, die verwendet wird, für die überprüfung der Anmeldeinformationen hier? Oder muss ich schreiben, dass meine eigenen AuthenticationProvider, dass es zu überprüfen wäre, wie ich will?
- Ich habe das exakt gleiche problem, Hast du jemals eine Lösung finden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung, die ich gefunden, um das problem zu überschreiben
configure
aufAuthorizationServerConfigurerAdapter
configure(AuthenticationManagerBuilder auth)
überschreiben vonWebSecurityConfigurerAdapter
Unterklasse wie diese:auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder)
sonst nur das client_secret kodiert wurde, nicht aber die Benutzer-Passwort.Wenn Sie nur wollen, um zu konfigurieren, spring-Authentifizierung mit einem anderen pass-encoder verwenden Sie dann diese Konfiguration.
Hinweis:- Während Benutzer anlegen müssen Sie die ver-userpassword mit dem selben Kennwort Encoder-Klasse.