2012-10-05 22 views
5

Vorrei implementare OAuth 2.0 per il mio progetto Spring 3.1 e RESTEasy. Il progetto è un servizio REST basato su JSON. Uso Spring Security 3.1 e spring-security-oauth2 versione 1.0.0.RC2 (che dovrebbe essere l'ultima). Finora ho la configurazione di sicurezza primavera con le impostazioni predefinite. Ho anche una configurazione di base (di default) per OAuth 2.0.Nessun adattatore per errore gestore per endpoint provider oauth2

Prima ho usato il servizio REST, funziona perfettamente. Anche la sicurezza Spring sembra funzionare bene. Sono reindirizzato a una pagina di accesso se apro un collegamento al mio servizio REST. Dopo l'accesso, posso effettuare chiamate REST che forniscono il risultato previsto.

Quando apro het URL localhost:8080/tools-service/oauth/token o localhost:8080/tools-service/oauth/error, per testare l'OAuth, ottengo un errore 500. Il seguente errore è show, quando accedo /oauth/token. L'errore per /oauth/error è simulare.

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?

Se ho ragione questo implica che c'è un errore nella funzione TokenEndpoint.getAccessToken? Dal momento che quella classe fa parte del framework Spring (e ho cercato il codice, che sembra buono), non penso che il problema sia effettivamente correlato a quelle classi. Il che mi lascia senza tracce.

Ora vorrei sapere perché questo succede e come posso risolvere questo. Ho considerato il fatto che, forse, non sono autorizzato a visitare quegli URL in un browser. Tuttavia se provo lo stesso con Sparklr2 (the Spring OAuth 2.0 sample application) ottengo un messaggio XML (per/oauth2/token) e una pagina di errore (per/oauth2/errore), che è come previsto.

Qualsiasi aiuto o suggerimento sarebbe molto apprezzato.


Security frammento legati da 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> 

mio contesto di applicazione carica il seguente file di sicurezza-config.xml ho creato:

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

L'implementazione CollectorClientDetails è solo fittizio codice:

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

} 

risposta

11

Dopo aver risolto questo problema per alcuni giorni, ho effettuato una nuova ricerca su Google. Questo mi ha portato al forum Spring Source: http://forum.springsource.org/showthread.php?130684-OAuth2-No-adapter-for-handler-exception.

Qui ho trovato che banifou aveva lo stesso problema. Dave Syer ha risposto alla domanda in questo modo:

Sembra che è stato rimosso il <mvc:annnotation-driven/> dal sparklr vaniglia. Penso che se lo rimettessi nell'adattatore dell'adattatore sarà definito per te.

La sicurezza Spring si basa sul framework Spring MVC per gestire richieste e risposte. Pertanto, è necessario includere il framework MVC e impostare correttamente la sicurezza di Spring OAuth affinché funzioni.

La soluzione è che ho aggiunto 2 tag al mio contesto di applicazione:

  • <mvc:annotation-driven />

Fai il framwork MVC pronto a gestire le annotazioni. Questo rende @FrameworkEndpoint funzionare correttamente. Quello poi utilizzato nel public class TokenEndpoint, che ha dato l'errore 500.

  • <mvc:default-servlet-handler />

Questo gestore inoltrerà tutte le richieste al servlet di default. Pertanto è importante che rimanga ultimo nell'ordine di tutti gli altri URL HandlerMappings. Questo sarà il caso se usi <mvc:annotation-driven>. (Citazione dalla documentazione di primavera.)

Maggiori informazioni possono essere trovate qui: 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

Sono contento che ci siano altri che rispondono alla loro stessa domanda in questo modo. Questo è un buon esempio di quanto sia oscuro il tuo problema, c'è sempre almeno un altro utente che sta vivendo la stessa cosa. Se potessi comprarti una birra lo farei, ma almeno avere un upvote :-) – Joe

+0

Vertongen, ho avuto lo stesso problema, tutti i risultati di Google correlati sono stati letti, ma solo il tuo ha risolto il mio problema, mancava dal mio codice. Grazie per aver risposto alla tua domanda e per darmi una mano! – szpetip

+0

Benvenuto. Sono felice che questo sia ancora utile dopo tutto questo tempo. – Vertongen

Problemi correlati