2012-10-05 14 views
5

Ich möchte OAuth 2.0 für mein Projekt Spring 3.1 und RESTEasy implementieren. Das Projekt ist ein JSON-basierter REST-Service. Ich benutze Spring Security 3.1 und Spring-Sicherheit-oauth2 Version 1.0.0.RC2 (die die neueste sein sollte). Bisher habe ich das Federsicherheits-Setup mit Standardeinstellungen vorgenommen. Ich habe auch eine sehr einfache (Standard) Konfiguration für OAuth 2.0.Kein Adapter für Handler-Fehler für oauth2-Provider-Endpunkte

Ich habe den REST-Dienst zuvor verwendet, es funktioniert perfekt. Die Spring-Sicherheit scheint auch gut zu funktionieren. Ich werde auf eine Login-Seite weitergeleitet, wenn ich einen Link zu meinem REST-Service öffne. Nach dem Einloggen kann ich REST-Aufrufe machen, die das erwartete Ergebnis liefern.

Wenn ich öffnen het urls localhost:8080/tools-service/oauth/token oder localhost:8080/tools-service/oauth/error, die OAuth zu testen, bekomme ich einen Fehler 500. Der folgende Fehler anzeigen, wenn ich /oauth/token zugreifen. Der Fehler für /oauth/error ist ähnlich.

HTTP Status 500 - No adapter for handler [public org.springframework.http.ResponseEntity org.springframework.security.oauth2.provider.endpoint.TokenEndpoint.getAccessToken(java.security.Principal,java.lang.String,java.util.Map)]: Does your handler implement a supported interface like Controller?

Wenn ich richtig bin bedeutet dies, dass ein Fehler in der TokenEndpoint.getAccessToken Funktion ist? Da diese Klasse Teil des Spring-Frameworks ist (und ich den Code nachgeschlagen habe, was gut aussieht), glaube ich nicht, dass das Problem tatsächlich mit diesen Klassen zusammenhängt. Was mich ahnungslos lässt.

Jetzt würde ich gerne wissen, warum das passiert und wie ich das lösen kann. Ich dachte über die Tatsache nach, dass ich diese URLs vielleicht nicht in einem Browser besuchen darf. Wenn ich jedoch dasselbe mit Sparklr2 (the Spring OAuth 2.0 sample application) versuche, erhalte ich eine XML-Nachricht (für/oauth2/token) und eine Fehlerseite (für/oauth2/error), die wie erwartet ist.

Jede Hilfe oder Tipp würde sehr geschätzt werden.


Sicherheitsrelevante Ausschnitt aus web.xml:

<filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

Mein Anwendungskontext die folgenden Sicherheits-config.xml-Datei lädt ich erstellt:

<?xml version="1.0" encoding="UTF-8"?> 

<beans 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:sec="http://www.springframework.org/schema/security" 
    xmlns:oauth="http://www.springframework.org/schema/security/oauth2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
         http://www.springframework.org/schema/security 
         http://www.springframework.org/schema/security/spring-security-3.1.xsd 
         http://www.springframework.org/schema/security/oauth2 
         http://www.springframework.org/schema/security/spring-security-oauth2.xsd"> 

    <sec:http auto-config="true"> 
     <sec:intercept-url pattern="/**" access="ROLE_USER" /> 
    </sec:http> 

    <sec:authentication-manager> 
     <sec:authentication-provider> 
      <sec:user-service> 
       <sec:user name="user1" password="test123" authorities="ROLE_USER" /> 
       <sec:user name="user2" password="hello123" authorities="ROLE_USER" /> 
      </sec:user-service> 
     </sec:authentication-provider> 
    </sec:authentication-manager> 

    <sec:global-method-security pre-post-annotations="enabled" proxy-target-class="true"> 
     <sec:expression-handler ref="oauthExpressionHandler" /> 
    </sec:global-method-security> 


    <bean id="clientDetailsService" class="be.collectortools.rest.service.security.CollectorDetailsServiceImpl" /> 

    <bean id="tokenStore" class="org.springframework.security.oauth2.provider.token.InMemoryTokenStore" /> 

    <bean id="tokenServices" class="org.springframework.security.oauth2.provider.token.DefaultTokenServices"> 
     <property name="tokenStore" ref="tokenStore" /> 
     <property name="supportRefreshToken" value="true" /> 
     <property name="clientDetailsService" ref="clientDetailsService"/> 
    </bean> 

    <oauth:authorization-server 
      client-details-service-ref="clientDetailsService" 
      token-services-ref="tokenServices"> 
     <oauth:authorization-code /> 
     <oauth:implicit /> 
     <oauth:refresh-token /> 
     <oauth:client-credentials /> 
     <oauth:password /> 
    </oauth:authorization-server> 

    <oauth:expression-handler id="oauthExpressionHandler" /> 

</beans> 

Die CollectorClientDetails Implementierung ist nur Attrappe code:

@Service 
public class CollectorDetailsServiceImpl implements ClientDetailsService { 

    @Resource 
    private CollectorClientDetailsRepository collectorClientDetailsRepository; 

    @Override 
    public ClientDetails loadClientByClientId(final String clientId) throws OAuth2Exception { 
     CollectorClientDetails dummyClient = new CollectorClientDetails(); 
     dummyClient.setClientId(clientId); 

     return dummyClient; 
    } 

} 

Antwort

11

Nachdem ich dieses Problem einige Tage ausklingen ließ, habe ich eine neue Google-Suche durchgeführt. Dies führte mich zum Spring Source Forum: http://forum.springsource.org/showthread.php?130684-OAuth2-No-adapter-for-handler-exception.

Hier fand ich, dass Banifou das gleiche Problem hatte. Dave Syer beantwortet die Frage wie folgt aus:

Es sieht aus wie Sie die <mvc:annnotation-driven/> aus der Vanille sparklr entfernt. Ich denke, wenn Sie das zurück in den Handler-Adapter setzen, wird für Sie definiert.

Die Spring-Sicherheit basiert auf dem Spring MVC-Framework, um Anfragen und Antworten zu bearbeiten. Daher muss das MVC-Framework eingebunden und ordnungsgemäß eingerichtet sein, damit Spring OAuth funktioniert.

Die Lösung ist, dass ich 2 Tags zu meinem Anwendungskontext hinzugefügt:

  • <mvc:annotation-driven />

Machen Sie das MVC framwork bereit Anmerkungen zu handhaben. Dadurch wird @FrameworkEndpoint ordnungsgemäß ausgeführt. Je später man in den public class TokenEndpoint verwendet wird, die den Fehler gab 500.

  • <mvc:default-servlet-handler />

Diese Handler alle Anforderungen an das Standard-Servlet weiterleiten werden. Daher ist es wichtig, dass es in der Reihenfolge aller anderen URL HandlerMappings zuletzt bleibt. Das wird der Fall sein, wenn Sie <mvc:annotation-driven> verwenden. (Zitat aus der Frühjahr-Dokumentation.)

Weitere Informationen finden Sie hier: annotation-driven, default-servlet-handler.

<?xml version='1.0' encoding='UTF-8'?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-3.1.xsd 
          http://www.springframework.org/schema/mvc 
          http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> 

    <context:component-scan base-package="be.collectortools.rest"/> 
    <context:annotation-config/> 

    <mvc:annotation-driven /> 
    <mvc:default-servlet-handler /> 

    <import resource="classpath:springmvc-resteasy.xml"/> 
    <import resource="mongo-config.xml"/> 
    <import resource="security-config.xml"/> 

</beans> 
+4

Ich bin froh, dass es andere gibt, die ihre eigene Frage so beantworten. Dies ist ein gutes Beispiel, egal wie unklar Ihr Problem ist, es gibt immer mindestens einen anderen Benutzer, der dasselbe erlebt. Wenn ich dir ein Bier kaufen könnte würde ich, aber wenigstens eine Upvote haben :-) – Joe

+0

Vertongen, ich hatte das selbe Problem, alle verwandten Google Ergebnisse wurden gelesen, aber nur deins löste mein Problem, das fehlte in meinem Code. Danke, dass du deine eigene Frage beantwortet hast und mir geholfen hast! – szpetip

+0

Ihre Begrüßung. Ich bin froh, dass dies nach all der Zeit immer noch nützlich ist. – Vertongen

Verwandte Themen