2012-10-05 50 views
5

我想爲我的Spring 3.1和RESTEasy項目實現OAuth 2.0。該項目是基於JSON的REST服務。我使用Spring Security 3.1和spring-security-oauth2版本1.0.0.RC2(它應該是最新的)。到目前爲止,我有彈簧安全設置與默認設置。我還爲OAuth 2.0配置了非常基本的(默認)配置。oauth2提供者端點的處理程序錯誤沒有適配器

我以前使用過REST服務,它工作的很完美。 Spring的安全性似乎也很好。如果我打開指向我的REST服務的鏈接,我將被重定向到登錄頁面。登錄後,我可以進行REST調用,以獲得預期的結果。

當我打開網址,過度緊張或localhost:8080/tools-service/oauth/tokenlocalhost:8080/tools-service/oauth/error,測試OAuth的,當我訪問/oauth/token我得到一個錯誤500 以下錯誤是表演。 /oauth/error的錯誤是相似的。

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文件片段:

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

我的應用程序上下文加載我創建了以下安全-config.xml文件:

<?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搜索。這導致我到Spring Source論壇:http://forum.springsource.org/showthread.php?130684-OAuth2-No-adapter-for-handler-exception

在這裏,我發現banifou有同樣的問題。戴夫Syer回答這樣的問題:

看起來你從 香草sparklr刪除<mvc:annnotation-driven/>。我想如果你把它放回處理器適配器 將會爲你定義。

Spring安全依靠Spring MVC框架來處理請求和響應。因此,需要將MVC框架包含在內併爲Spring安全OAuth正常工作。

的解決方案是,我加了2個標籤到我的應用程序上下文:

  • <mvc:annotation-driven />

充分利用MVC framwork準備處理註解。這使@FrameworkEndpoint正常工作。後來一個在public class TokenEndpoint被使用,這給了錯誤500

  • <mvc:default-servlet-handler />

該處理器將轉發到默認的Servlet的所有請求。因此,重要的是它保持最後的所有其他URL HandlerMappings的順序。如果您使用<mvc:annotation-driven>,情況就會如此。 (引自Spring文檔)。

更多信息可以在這裏找到: annotation-drivendefault-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

我很高興有其他人回答他們自己的問題是這樣的。這是一個很好的例子,不管你的問題多麼模糊,總有至少一個其他用戶遇到同樣的事情。如果我可以給你買一瓶啤酒,但至少有一個贊同:-) – Joe

+0

Vertongen,我有同樣的問題,所有相關的谷歌結果已被閱讀,但只有你解決了我的問題,從我的代碼中丟失。感謝您回答您自己的問題並幫助我! – szpetip

+0

歡迎您。我很高興,這一次仍然有用。 – Vertongen

相關問題