2016-04-22 1 views
3

Ich habe versucht, OAuth 2 für meine Anwendung zu verwenden, aber ich laufe weiterhin mit konfigurationsbezogenen Fehlern, insbesondere mit Authentifizierungstoken, um. Die Anwendung ist so eingerichtet, dass sie sowohl als Autorisierungs- als auch als Ressourcenserver fungiert. Ich habe es erfolgreich so konfiguriert, dass Tokens mit dem Kennwortertyp mit einem speicherinternen Tokenspeicher ausgestellt wurden. jedes Mal, wenn ich jedoch versuchen, für beschränkte Ressourcen-Anforderungen zu senden, erhalte ich Fehler zu sagen:Wie richte ich PreAuthenticationAuthenticationProvider ein?

org.springframework.security.authentication.ProviderNotFoundException: No AuthenticationProvider found for org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken 

So habe ich versucht, ein PreAuthenticationAuthenticationProvider in meiner Konfiguration einrichten:

@Autowired 
private UserDetailsManager userManager; 

@Bean 
public AuthenticationProvider preAuthenticationAuthenticationProvider() { 
    PreAuthenticatedAuthenticationProvider authenticationProvider = 
     new PreAuthenticatedAuthenticationProvider(); 
    UserDetailsByNameServiceWrapper userDetailsWrapper = new UserDetailsByNameServiceWrapper(userManager); 
    authenticationProvider.setPreAuthenticatedUserDetailsService(userDetailsWrapper); 
    return authenticationProvider; 
} 

Aber ich bin immer NullPointerException in seltsamen Orten, wie:

java.lang.NullPointerException: null 
    at org.springframework.security.authentication.AccountStatusUserDetailsChecker.check(AccountStatusUserDetailsChecker.java:17) ~[spring-security-core-4.0.3.RELEASE.jar!/:4.0.3.RELEASE] 

ich frage mich, was die einfachste Konfiguration hierfür ist, und warum ich es in erster Linie müssen? Liegt es daran, dass ich @PreAuthorize Anmerkungen habe?

Hier ist, wie ich den Ressource-Server eingerichtet:

@Configuration 
protected static class ResourceServer extends ResourceServerConfigurerAdapter { 

    @Autowired 
    private TokenStore tokenStore; 

    @Autowired 
    private AuthenticationManager authenticationManager; 

    @Override 
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 
     resources.tokenStore(tokenStore).authenticationManager(authenticationManager); 
    } 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     //http configuration 
    } 

} 

Die TokenStore ist nur ein Beispiel von InMemoryTokenStore und AuthenticationManager wird auf diese Weise eingerichtet:

@Configuration 
protected static class WebSecurity extends WebSecurityConfigurerAdapter { 

    @Autowired 
    protected UserDetailsManager userManager; 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.authenticationProvider(preAuthenticationAuthenticationProvider()) 
       .userDetailsService(userManager).passwordEncoder(PASSWORD_ENCODER); 
    } 

    @Bean 
    @Override 
    protected AuthenticationManager authenticationManager() throws Exception { 
     return super.authenticationManager(); 
    } 

    @Bean 
    protected AuthenticationProvider preAuthenticationAuthenticationProvider() { 
     PreAuthenticatedAuthenticationProvider authenticationProvider = 
       new PreAuthenticatedAuthenticationProvider(); 
     UserDetailsByNameServiceWrapper userDetailsWrapper = new UserDetailsByNameServiceWrapper(userManager); 
     authenticationProvider.setPreAuthenticatedUserDetailsService(userDetailsWrapper); 
     return authenticationProvider; 
    } 

} 
+0

Können Sie erklären, was seltsame Orte bedeuten? Wie haben Sie Ihren Authentifizierungsserver und Ressourcenserver konfiguriert? – aksappy

+0

Ich habe die Frage mit einigen Zeilen aus dem StackTrace aktualisiert. –

+0

Der Authentifizierungsanbieter scheint nicht ordnungsgemäß mit Ihrem Authentifizierungsmanager verbunden zu sein. Verwenden Sie eine Annotation-basierte Konfiguration oder XML? Können Sie die Sicherheitskonfigurationen Ihres Ressourcenservers teilen? – aksappy

Antwort

0

Was ich fehlte ist AuthorizationServiceTokenServices und ResourceServerTokenServices. Beide diese Schnittstellen werden von Spring DefaultTokenServices implemented.

@Bean 
public DefaultTokenServices tokenServices() { 
    DefaultTokenServices tokenServices = new DefaultTokenServices(); 
    tokenServices.setTokenStore(tokenStore()); 
    tokenServices.setAuthenticationManager(authenticationManager); 
    return tokenServices; 
} 

In Autorisierungs-Server-Konfiguration (AuthorizationServiceConfigurerAdapter), ich habe folgendes Setup:

@Override 
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
    endpoints.tokenServices(tokenServices()).authenticationManager(authenticationManager); 
} 

In der Ressource-Server-Konfiguration (ResourceServerConfigurerAdapter):

@Autowired 
private DefaultTokenServices tokenServices; 

@Override 
public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 
    resources.tokenServices(tokenServices); 
} 

Mit all diesen Komponenten, Meine App funktioniert ohne PreAuthenticationAuthenticationProvider Bean definiert.