2012-10-05 2 views
5

내 Spring 3.1 및 RESTEasy 프로젝트에 OAuth 2.0을 구현하고 싶습니다. 프로젝트는 JSON 기반 REST 서비스입니다. 나는 스프링 보안 3.1과 스프링 - 보안 -auth2 버전 1.0.0.RC2 (최신 버전이어야한다)를 사용한다. 지금까지 기본 설정으로 봄 보안 설정이 있습니다. OAuth 2.0에 대한 기본 (기본) 구성도 있습니다.oauth2 제공자 엔드 포인트에 대한 핸들러 오류에 대한 어댑터가 없습니다.

나는 REST 서비스를 사용하기 전에 완벽하게 작동합니다. 스프링 보안 또한 잘 작동하는 것 같습니다. 내 REST 서비스에 대한 링크를 열면 로그인 페이지로 리디렉션됩니다. 로그인 한 후 예상 결과를 제공하는 REST 호출을 만들 수 있습니다. 내가 /oauth/token에 액세스 할 때

나는 OAuth를 테스트하기 위해, HET는 localhost:8080/tools-service/oauth/token 또는 localhost:8080/tools-service/oauth/error URL을 열

, 나는 다음과 같은 오류가 표시 오류 (500) 를 얻을. /oauth/error에 대한 오류는 simular입니다. 내가 올바른 생각하면

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?

이는 TokenEndpoint.getAccessToken 기능에 오류가 있음을 의미? 이 클래스는 Spring 프레임 워크의 일부이기 때문에 실제로 문제는 그 클래스와 관련이 없다고 생각합니다. 날 우둔하게 만든다.

이제 이런 일이 발생하는 이유와 해결 방법을 알고 싶습니다. 브라우저에서 해당 URL을 방문하는 것이 허용되지 않는다고 생각했습니다. 그러나 내가 Sparklr2 (the Spring OAuth 2.0 sample application)로 같은 것을 시도하면 XML 메시지 (/ oauth2/토큰)와 오류 페이지 (/ oauth2/오류)가 예상대로 발생합니다.

도움이나 의견을 보내 주시면 감사하겠습니다. web.xml 파일에서


보안 관련 코드 조각 : 내 애플리케이션 컨텍스트는 내가 만든 다음 보안-config.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> 

:

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

CollectorClientDetails 구현은 더미입니다 코드 :

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

} 

답변

11

며칠 동안이 문제를 식히기 위해 새로운 Google 검색을 수행했습니다. 이것은 스프링 소스 포럼으로 연결되었습니다 : http://forum.springsource.org/showthread.php?130684-OAuth2-No-adapter-for-handler-exception.

여기 banifou도 같은 문제가 있음을 발견했습니다. 당신이 바닐라 sparklr에서 <mvc:annnotation-driven/>을 제거 같은

것 같습니다 : 데이브 Syer이 같은 질문에 대답했다. 제 생각에는 핸들러 어댑터에 다시 넣으면 이 정의 될 것입니다.

스프링 보안은 요청과 응답을 처리하기 위해 Spring MVC 프레임 워크에 의존한다. 따라서 스프링 보안 OAuth가 작동하도록 MVC 프레임 워크가 포함되고 올바르게 설정되어야합니다.

이 솔루션은 내가 내 응용 프로그램 컨텍스트에이 태그를 추가한다는 것입니다 :

  • <mvc:annotation-driven />

가 주석을 처리 할 수있는 MVC의 framwork 준비합니다. 이렇게하면 @FrameworkEndpoint가 제대로 작동합니다. 오류이 핸들러는 기본 서블릿에 대한 모든 요청을 전달합니다
  • <mvc:default-servlet-handler />
    • (500)를 준 public class TokenEndpoint에서 사용중인 나중에 하나. 따라서 다른 모든 URL HandlerMappings의 순서대로 마지막에 남는 것이 중요합니다. <mvc:annotation-driven>을 사용하는 경우에 해당됩니다. (봄 문서 인용.)

      더 많은 정보는 여기에서 찾을 수 있습니다 : 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

    다른 사람들이 이와 같이 자신의 질문에 답변 해 주니 기쁩니다. 이것은 문제가 얼마나 모호 하든지 상관없이 적어도 한 명의 다른 사용자가 항상 같은 것을 경험하고 있다는 것을 보여주는 좋은 예입니다. 내가 당신에게 맥주를 사주고 싶지만 최소한 upvote를 가지고 있다면 :-) – Joe

    +0

    Vertongen, 나는 관련된 모든 Google 결과를 읽었지만 문제 만 해결했다. 가 내 코드에서 누락되었습니다. 나 자신의 질문에 답하고 나를 도와 주셔서 감사합니다! – szpetip

    +0

    환영합니다. 나는이 모든 시간 이후 여전히 유용하다는 것이 행복하다. – Vertongen

    관련 문제