2014-09-24 5 views
9

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?

+1

Sto avendo lo stesso identico problema Hai mai trovato una soluzione? – Leon

risposta

14

La soluzione che ho trovato al problema è quello di ignorare configure su AuthorizationServerConfigurerAdapter

@Override 
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { 
    oauthServer.passwordEncoder(passwordEncoder); 
} 
+1

Nota che ho anche dovuto impostarlo nella 'sottoclasse' configure (AuthenticationManagerBuilder auth) 'della sottoclasse' WebSecurityConfigurerAdapter' come questa: 'auth.userDetailsService (userDetailsService) .passwordEncoder (passwordEncoder)' altrimenti solo il client_secret era codificato, ma non il password degli utenti. –

+0

thx per il suggerimento client_secret, ho dimenticato di codificarlo – davey

-1

Se si desidera configurare l'autenticazione a molla con un altro encoder di passaggio, utilizzare questa configurazione.

<bean id="encoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder"/> 

<authentication-manager alias="authenticationManager"> 
     <authentication-provider user-service-ref="authenticationService"> 
     <password-encoder ref ="encoder" /> 

      <!-- <user-service> 
       <user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN"/> 
      </user-service> --> 
     </authentication-provider> 
    </authentication-manager> 

Nota: - Durante la creazione di utente è necessario per crittografare userpassword con questa stessa classe la password Encoder.

+0

Non sto facendo la stessa cosa ma usando la configurazione basata su Java. Sto impostando l'autenticazioneProvider: auth.authenticationProvider (daoAuthenticationProvider()); precedentemente configurato per utilizzare SHAPasswordEncoder. O mi sbaglio di questo? – gajos

+0

è possibile configurare con qualsiasi passwordEncoder. ricorda che la password utente deve essere crittografata utilizzando lo stesso metodo di codifica della classe passwordEncoder. –

+0

in configurazione XML si può fare riferimento un altro passwordEncoder, org.springframework.security.providers.dao.DaoAuthenticationProvider

Problemi correlati