2012-10-05 16 views
5

Chciałbym zaimplementować OAuth 2.0 dla mojego projektu Spring 3.1 i RESTEasy. Projekt jest usługą REST opartą na JSON. Używam Spring Security 3.1 i spring-security-oauth2 w wersji 1.0.0.RC2 (która powinna być najnowsza). Do tej pory mam wiosenną konfigurację zabezpieczeń z domyślnymi ustawieniami. Mam również bardzo podstawową (domyślną) konfigurację OAuth 2.0.Brak adaptera dla błędu obsługi dla punktów końcowych dostawcy Oauth2

Korzystałem wcześniej z usługi REST, działa idealnie. Bezpieczeństwo wiosenne również wydaje się działać dobrze. Zostaję przekierowany do strony logowania, jeśli otworzę link do mojej usługi REST. Po zalogowaniu mogę wykonywać wywołania REST, które dają oczekiwany rezultat.

Kiedy otwieram het adresy URL localhost:8080/tools-service/oauth/token lub localhost:8080/tools-service/oauth/error, aby przetestować OAuth, pojawia się błąd 500. następujący błąd, to pokazać, kiedy dostęp /oauth/token. Błąd dla /oauth/error jest podobny.

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?

Jeśli jestem poprawny oznacza to, że wystąpił błąd w funkcji TokenEndpoint.getAccessToken? Ponieważ ta klasa jest częścią struktury Spring (i sprawdziłem kod, który wygląda dobrze) nie sądzę, że problem jest faktycznie związany z tymi klasami. Co pozostawia mnie bez pojęcia.

Teraz chciałbym wiedzieć, dlaczego tak się dzieje i jak mogę to rozwiązać. Rozważyłem fakt, że nie mogę odwiedzać tych adresów URL w przeglądarce. Jednak jeśli spróbuję tego samego z Sparklr2 (the Spring OAuth 2.0 sample application) otrzymam komunikat XML (dla/oauth2/token) i stronę błędu (dla/oauth2/error), która jest zgodna z oczekiwaniami.

Każda pomoc lub napiwek będzie bardzo doceniana.


bezpieczeństwo związane z urywek 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> 

Moje kontekst aplikacji ładuje następujący plik security-config.xml I Utworzono:

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

Realizacja CollectorClientDetails to tylko atrapa kod:

@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; 
    } 

} 

Odpowiedz

11

Po ostudzeniu tego problemu przez kilka dni zrobiłem nowe wyszukiwanie w Google. To doprowadziło mnie do źródła Source forum: http://forum.springsource.org/showthread.php?130684-OAuth2-No-adapter-for-handler-exception.

Tutaj stwierdziłem, że banifou miał ten sam problem. Dave Syer odpowiedział na pytanie tak:

Wygląda jakbyś usunął <mvc:annnotation-driven/> z sparklr waniliowym. Myślę, że jeśli włożysz to z powrotem do adaptera obsługi, zostanie ci zdefiniowany adapter .

Bezpieczeństwo wiosenne opiera się na wiosennych ramach MVC w celu rozpatrzenia wniosków i odpowiedzi. W związku z tym ramy MVC muszą zostać uwzględnione i odpowiednio skonfigurowane, aby OAuth wiosennej ochrony działał.

Rozwiązaniem jest, że dodaje się 2 znaczniki do mojego kontekstu aplikacji:

  • <mvc:annotation-driven />

Dodać można zorganizować MVC gotowy do obsługi adnotacji. To sprawia, że ​​@FrameworkEndpoint działa poprawnie. Im później jeden używany w public class TokenEndpoint, co dało błąd 500.

  • <mvc:default-servlet-handler />

Ten uchwyt przekazuje wszystkie żądania do domyślnego serwletu. Dlatego ważne jest, aby pozostał on ostatni w kolejności wszystkich innych adresów URL HandlerMappings. Tak będzie w przypadku korzystania z <mvc:annotation-driven>. (Cytat z dokumentacji wiosennym.)

Więcej informacji można znaleźć tutaj: 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

Cieszę się, że są inni, którzy odpowiadają na własne pytanie w ten sposób. Jest to dobry przykład, niezależnie od tego, jak zaciemniasz swój problem, zawsze przynajmniej jeden inny użytkownik doświadcza tego samego. Gdybym mógł kupić ci piwo, zrobiłbym, ale przynajmniej upto rzecz :-) – Joe

+0

Vertongen, miałem ten sam problem, wszystkie powiązane wyniki google zostały przeczytane, ale tylko twój rozwiązał mój problem, brakuje w moim kodzie. Dziękuję za odpowiedź na własne pytanie i udzielenie mi pomocy! – szpetip

+0

Twoje powitanie. Cieszę się, że po tak długim czasie jest to przydatne. – Vertongen

Powiązane problemy