2014-09-24 14 views
9

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?

+1

ich genau das gleiche Problem habe außer Kraft setzen Haben Sie jemals ein Update finden? – Leon

Antwort

14

Die Lösung, die ich für das Problem gefunden ist configure auf AuthorizationServerConfigurerAdapter

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

Beachten Sie, dass ich es auch in der 'configure (AuthenticationManagerBuilder auth)' Überschreibung der 'WebSecurityConfigurerAdapter' Unterklasse setzen musste:' auth.userDetailsService (userDetailsService) .passwordEncoder (passwordEncoder) 'ansonsten wurde nur der client_secret kodiert, aber nicht der Benutzerkennwort. –

+0

thx für den client_secret Hinweis, ich habe vergessen, es zu kodieren – davey

-1

Wenn Sie nur die Feder-Authentifizierung mit einem anderen Pass-Encoder konfigurieren möchten, verwenden Sie diese Konfiguration.

<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> 

Hinweis: - Während der Benutzer erstellen Sie müssen mit dem gleichen Passwort Encoder-Klasse verschlüsseln userpassword.

+0

Mache ich nicht dasselbe, aber benutze die Java-basierte Konfiguration. Ich setze den authenticationProvider: auth.authenticationProvider (daoAuthenticationProvider()); , die zuvor für die Verwendung von SHAPasswordEncoder konfiguriert wurde. Oder liege ich falsch? – gajos

+0

können Sie mit jedem passwordEncoder konfigurieren. Denken Sie daran, dass das Benutzerpasswort mit der gleichen Methode passwordEncoder class encode verschlüsselt werden sollte. –

+0

in XML-Konfiguration wir einen weiteren passwordEncoder beziehen,

Verwandte Themen