Sono abbastanza nuovo per Spring Oauth e Spring Security. Sto cercando di utilizzare il flusso client_credentials nel mio progetto. Per ora sono riuscito a utilizzare il mio CustomDetailsService per recuperare client_id e password (segreti) da un database già esistente nel mio sistema. L'unico problema è che non riesco a modificare il codificatore della password in DaoAuthenticationProvider utilizzato da AuthorizationServer: è impostato per impostazione predefinita su PlaintextPasswordEncoder. Non ero in grado di configurarlo in questo modo, che userebbe ad esempio SHAPasswordEncoder. Utilizza sempre il codificatore in chiaro. Probabilmente non capisco abbastanza bene il flusso, visto che sono un principiante in primavera.Primavera Oauth2. Il codificatore della password non è impostato in DaoAuthenticationProvider
Ecco un codice di mine (con non funzionante configurazione del 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 {
...
}
}
E la classe ClientDetailsService personalizzato:
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;
}
}
L'encodedPassword che viene assunto dal mio UserService è sempre una cattiva credenziale, dato che DaoAuthenticationProvider ha un PlaintextPasswordEncoder impostato di default.
Cosa mi manca? È possibile impostare il codificatore della password nel DaoAuthenticationProvider utilizzato per verificare le credenziali qui? O devo scrivere il mio AuthenticationProvider, che lo controllerebbe nel modo che voglio?
Sto avendo lo stesso identico problema Hai mai trovato una soluzione? – Leon