Ich bin ziemlich neu in Spring Oauth und Spring Security. Ich versuche, den client_credentials-Flow in meinem Projekt zu verwenden. Im Moment konnte ich meinen eigenen CustomDetailsService verwenden, um client_id und password (secret) von einer Datenbank zu holen, die bereits in meinem System existiert. Das einzige Problem ist, dass ich den Passwort-Encoder in DaoAuthenticationProvider, der von AuthorizationServer verwendet wird nicht ändern kann - es ist standardmäßig auf PlaintextPasswordEncoder festgelegt. Ich war nicht in der Lage, es so zu konfigurieren, dass es zum Beispiel SHAPasswordEncoder verwenden würde. Es verwendet immer den Klartext-Encoder. Ich verstehe den Flow wahrscheinlich nicht gut genug, da ich im Frühjahr ein Neuling bin.Frühling Oauth2. Passwort-Encoder ist nicht in DaoAuthenticationProvider
Hier einige Code von mir (mit nicht Konfiguration DaoAuthenticationProvider Arbeits):
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 die benutzerdefinierte 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;
}
}
Die encodedPassword, die getroffen wird, von meinem UserService ist immer eine schlechte Credential, da DaoAuthenticationProvider standardmäßig einen PlaintextPasswordEncoder hat.
Was fehlt mir dort? Ist es möglich, den Passwort-Encoder im DaoAuthenticationProvider zu setzen, der zur Überprüfung der Anmeldedaten verwendet wird? Oder muss ich meinen eigenen AuthenticationProvider schreiben, der es so prüft, wie ich es möchte?
ich genau das gleiche Problem habe außer Kraft setzen Haben Sie jemals ein Update finden? – Leon