6

Ho un'applicazione che ha @EnableOAuth2Sso sul WebSecurityConfigurerAdapterPrimavera di sicurezza OAuth2 - @ EnableOauth2Sso ma accettare gettoni come l'autenticazione, anche

Dopo aver aggiunto @EnableOAuth2Sso l'applicazione mi reindirizza al server di autorizzazione e consente l'accesso dopo il login a questo server di autorizzazione . Voglio offrire l'accesso API così, quindi voglio applicazioni siano in grado di accedere alle mie risorse passando un access token tramite l'Autorizzazione-Header

Authorization: bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9... 

ho debuged attraverso il filtro di autenticazione che viene utilizzato con @EnableOAuth2Sso notato, che l'autorizzazione -Il valore della persona non viene controllato.

Dopo di che ho cercato di creare un filtro personalizzato e ha aggiunto questo filtro per la configurazione di sicurezza

@Override 
public void configure(HttpSecurity http) throws Exception { 
    http.addFilter(myCustomFilter) 
    ...; 
} 

Ma ora ho la seguente eccezione:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is org.springframework.security.config.annotation.AlreadyBuiltException: This object has already been built 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) 
    ... 26 more 
Caused by: org.springframework.security.config.annotation.AlreadyBuiltException: This object has already been built 
    at org.springframework.security.config.annotation.AbstractSecurityBuilder.build(AbstractSecurityBuilder.java:44) 
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.springSecurityFilterChain(WebSecurityConfiguration.java:105) 
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$f0788cea.CGLIB$springSecurityFilterChain$5(<generated>) 
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$f0788cea$$FastClassBySpringCGLIB$$7e95689d.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) 
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:318) 
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$f0788cea.springSecurityFilterChain(<generated>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) 

In un primo momento ho pensato che ho Ho fatto qualcosa di sbagliato all'interno del mio filtro ma ho finito con una semplice classe di filtro che non faceva nient'altro che procedere con la filterchain e avere ancora lo stesso errore.

Così ho due domande:

  1. Perché ottengo questa eccezione?
  2. Esiste un modo per consentire l'autenticazione del token per gli endpoint in un'applicazione che utilizza @EnableOAuth2Sso?
+0

Immagino tu intenda * @ EnableOAuth2Sso * invece di * @ EnableSso *? Puoi approfondire "redirect funziona bene" e "Autorizzazione-intestazione con un token al portatore, anche" un po 'di più – jah

+0

Sì hai ragione. Ho corretto gli errori di battitura e ho cercato di spiegare meglio cosa volevo ottenere. –

risposta

7

Il motivo dell'eccezione era l'ordinamento dei filtri come @jah detto.

Quello che ho fatto per ottenere l'autenticazione delle richieste, contenente un token di accesso nell'Autorizzazione-Intestazione, è quello di creare una classe ApiTokenAccessFilter che si estende OAuth2AuthenticationProcessingFilter. Questo filtro utilizza un parametro di costruttore ResourceServerTokenServices e imposta il flag di stato su false.

public class ApiTokenAccessFilter extends OAuth2AuthenticationProcessingFilter { 

    public ApiTokenAccessFilter(ResourceServerTokenServices resourceServerTokenServices) { 

    super(); 
    setStateless(false); 
    setAuthenticationManager(oauthAuthenticationManager(resourceServerTokenServices)); 
    } 

    private AuthenticationManager oauthAuthenticationManager(ResourceServerTokenServices tokenServices) { 

    OAuth2AuthenticationManager oauthAuthenticationManager = new OAuth2AuthenticationManager(); 

    oauthAuthenticationManager.setResourceId("oauth2-resource"); 
    oauthAuthenticationManager.setTokenServices(tokenServices); 
    oauthAuthenticationManager.setClientDetailsService(null); 

    return oauthAuthenticationManager; 
    } 
} 

Nella mia configurazione di sicurezza ho usato questo filtro come segue:

@Configuration 
@EnableOAuth2Sso 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private ResourceServerTokenServices tokenServices; 

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

    http.authorizeRequests() 
     .anyRequest() 
     .authenticated() 
     .and() 
     .addFilterBefore(new ApiTokenAccessFilter(tokenServices), AbstractPreAuthenticatedProcessingFilter.class); 
    } 
} 

credo che questo potrebbe essere più facile così ho aperto un problema sul spring-security-oauth Github repo.Non sono sicuro se questa soluzione è la strada da percorrere, ma non ho trovato un'altra alternativa.

2

Questa è una risposta per la prima domanda. Si ottiene questa eccezione perché si sta tentando di aggiungere un filtro a una catena di filer senza specificare un ordine. La catena di filtri consiste di diversi filtri in un fixed order. L'eccezione viene generata nello check for the existence del filtro da aggiungere. org.springframework.security.config.annotation.AlreadyBuiltException nel AbstractSecurityBuilder quando si verifica un'eccezione al suo interno. Quindi una vasta gamma di eccezioni che avvengono all'interno dello AbstractSecurityBuilder stanno causando questa eccezione non correlata.

Un modo possibile aggiungere il filtro sarebbe quella di utilizzare i addFilterBefore(Filter filter, Class<? extends Filter> beforeFilter) o le addFilterAfter(Filter filter, Class<? extends Filter> afterFilter) metodi di HttpSecurity.

Per quanto riguarda la seconda domanda, è necessario fornire ulteriori informazioni.

+0

proverò qualcosa in base alla tua risposta. se funziona, fornisco la soluzione completa e contrassegno la risposta come corretta. lo farò domani –

+0

grazie per il suggerimento relativo all'ordinamento dei filtri. Mi ha portato più vicino alla soluzione. +1 per quello –

Problemi correlati