2016-09-13 7 views
5

Ich habe eine Spring App - nicht eine Spring Boot App - das ich versuche, einen Abschnitt der API als OAuth2 mit Spring Security geschützt zu deklarieren. Meine Autorisierung und allgemeine Ressourcenzugriffskonfiguration funktioniert großartig, wenn ich http Elemente im XML definiere, aber wenn ich versuche, die Ressourcenzugriffsblöcke unter Verwendung von ResourceServerConfigureAdapter#configure(HttpSecurity) - komplett mit @EnableResourceServer usw. zu implementieren, wird die Methode configure niemals ausgelöst (Ende-zu-Ende-Tests schlagen ebenfalls fehl)). Beispiel Java config unter:Spring Security OAuth Java-Konfig

Ich habe versucht, ein paar verschiedene Möglichkeiten zur Durchführung der Config, aber keine Würfel. Nämlich habe ich beide Top-Level @Configuration Klassen, die ResourceServerConfigurerAdapter erweitern und Bean-Methoden ResourceServerConfiguration wie in Dave Syer's example; Ich habe auch versucht, die Reihenfolge auf Ordered.HIGHEST_PRECEDENCE auf den entsprechenden Beans explizit festzulegen.

Es ist sehr wichtig zu beachten, dass der Großteil der Legacy-Sicherheitskonfiguration der Anwendung über XML-Elemente wie oben definiert ist. Eine weitere mögliche rote Markierung über meine Konfiguration - um den Token-Endpunkt zur Authentifizierung gegen die Basisauth client_id zu bekommen: client_secret Ich musste meine eigene BasicAuthFilter(ProviderManager(DaoAuthProvider(ClientUserDetailsService(clientDetailsService))))) wenn, weil es die Vanille ist und 'richtige' Weise, den Token-Endpunkt zu authentifizieren, I ' d erwarten Sie, dass die Spring-Konfig nur voreingestellt ist.

Wie auch immer, in keiner Situation kann ich ResourceServerConfigureAdapter#configure(HttpSecurity) zu feuern bekommen. Meine laufenden Theorien sind:

  • etwas über die vorhergehenden XML HTTP Blöcke verhindert meine configure Methode immer noch

  • Das ist einfach eine Feder-Boot nur Funktion aufgerufen wird - obwohl ich gesehen habe keine Sprache in diesem Sinne

  • Es ist gerade nach oben ein Objekt im Anwendungskontext, die ich (wieder bin fehlt, die operativen Anmerkungen, die ich bei der Arbeit haben - neben den offensichtlichen @Configuration und @Bean - sind 01.238., @EnableAuthenticationServer und @EnableResourceServer).

  • Ich habe einige Konfigurationsfehler (duh) gemacht.

Alle Beispiele sehr geschätzt

Beispiel OAuth2 Konfigurationsklasse (eine der wenigen verschiedenen Iterationen) unten würde:

@Configuration 
@EnableWebSecurity 
@EnableResourceServer 
public class OAuth2Configuration { 
    ... etc ... 

    @Bean 
    public ResourceServerConfiguration adminResources() { 
     // copped from https://github.com/spring-projects/spring-security-oauth/tree/master/tests/annotation/multi 
     ResourceServerConfiguration resource = new ResourceServerConfiguration() { 
      public void setConfigurers(List<ResourceServerConfigurer> configurers) { 
       super.setConfigurers(configurers); 
      } 
     }; 

     resource.setConfigurers(Collections.singletonList(new ResourceServerConfigurerAdapter() { 

      @Override 
      public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 
       resources.resourceId("oauth2/control"); 
      } 

      @Override 
      public void configure(HttpSecurity http) throws Exception { 
       http.antMatcher("/api/**") 
        .authorizeRequests().anyRequest().hasRole("OAUTH_USER").and() 
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() 
        // before=PRE_AUTH_FILTER 
        .addFilterBefore(oAuth2AuthenticationProcessingFilter, AbstractPreAuthenticatedProcessingFilter.class) 
        .csrf().disable() 
        .anonymous().disable() 
        .exceptionHandling() 
        .accessDeniedHandler(oAuth2AccessDeniedHandler) 
        .authenticationEntryPoint(loginUrlAuthenticationEntryPoint); 
      } 

     })); 
     resource.setOrder(Ordered.HIGHEST_PRECEDENCE); 

     return resource; 
    } 

    @Configuration 
    @EnableAuthorizationServer 
    public static class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { 
     ... etc ... 
    } 
} 

Analogogous <http> Config dass ist aufgenommen:

<sec:http pattern="/api/**" create-session="stateless" 
      entry-point-ref="loginUrlAuthenticationEntryPoint"> 
    <sec:anonymous enabled="false" /> 
    <sec:csrf disabled="true"/> <!-- csrf tokens don't make sense for a 3rd party API --> 
    <sec:custom-filter ref="oauth2ProcessingFilter" before="PRE_AUTH_FILTER"/> 
    <sec:access-denied-handler ref="oauthAccessDeniedHandler" /> 
    <sec:intercept-url pattern="/api/**" access="hasRole('OAUTH_USER')" /> 
</sec:http> 

Antwort

1

Wenn Sie Wenn Sie gleichzeitig sowohl die Java-basierte als auch die XML-basierte Sicherheitskonfiguration verwenden, wird nur die XML-basierte Methode verwendet. Haben Sie versucht, alle Ihre XML-basierten http-Sicherheitskonfigurationen zu deaktivieren/auskommentieren und festzustellen, ob Ihre Java-basierten aktiviert werden?

Ich hatte ein ähnliches Problem zuvor. Ich habe beim Spring Security Git Channel um Hilfe gebeten und auch ein paar Nachforschungen angestellt.Siehe unten:

enter image description here

+0

erraten Sollte haben. Danke @Sofia! – jwilner