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;
}
}
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
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
Ihre Begrüßung. Ich bin froh, dass dies nach all der Zeit immer noch nützlich ist. – Vertongen