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;
}
}
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
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
Twoje powitanie. Cieszę się, że po tak długim czasie jest to przydatne. – Vertongen