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;
}
}
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
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
Benvenuto. Sono felice che questo sia ancora utile dopo tutto questo tempo. – Vertongen