2012-10-05 21 views
5

के लिए हैंडलर त्रुटि के लिए कोई एडाप्टर नहीं है, मैं अपने स्प्रिंग 3.1 और RESTEasy प्रोजेक्ट के लिए OAuth 2.0 को कार्यान्वित करना चाहता हूं। परियोजना एक JSON आधारित आरईएसटी सेवा है। मैं स्प्रिंग सिक्योरिटी 3.1 और वसंत-सुरक्षा-ओथ 2 संस्करण 1.0.0 का उपयोग करता हूं। आरसी 2 (जो नवीनतम होना चाहिए)। अभी तक मेरे पास डिफ़ॉल्ट सेटिंग्स के साथ वसंत सुरक्षा सेटअप है। मेरे पास OAuth 2.0 के लिए बहुत बुनियादी (डिफ़ॉल्ट) कॉन्फ़िगरेशन भी है।oauth2 प्रदाता एंडपॉइंट्स

मैंने पहले आरईएसटी सेवा का उपयोग किया, यह सही काम करता है। वसंत सुरक्षा भी ठीक काम करने लगती है। अगर मैं अपनी आरईएसटी सेवा के लिए एक लिंक खोलता हूं तो मुझे लॉगिन पेज पर रीडायरेक्ट किया जाता है। लॉग इन करने के बाद मैं आरईएसटी कॉल कर सकता हूं जो अपेक्षित परिणाम देता है।

जब मैं खोलने हेट यूआरएल localhost:8080/tools-service/oauth/token या localhost:8080/tools-service/oauth/error, OAuth परीक्षण करने के लिए, मैं एक त्रुटि 500 ​​ निम्न त्रुटि शो है जब मैं /oauth/token पहुँच जाते हैं। /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 समारोह में एक त्रुटि है कि वहाँ? चूंकि वह वर्ग वसंत ढांचे का हिस्सा है (और मैंने कोड देखा, जो ठीक दिखता है) मुझे नहीं लगता कि समस्या वास्तव में उन वर्गों से संबंधित है। जो मुझे अनजान छोड़ देता है।

अब मैं जानना चाहता हूं कि ऐसा क्यों होता है और मैं इसे कैसे हल कर सकता हूं। मैंने इस तथ्य को माना कि मुझे, शायद, ब्राउज़र में उन यूआरएल का दौरा करने की अनुमति नहीं है। हालांकि अगर मैं स्पार्कलर 2 (the Spring OAuth 2.0 sample application) के साथ ऐसा करने की कोशिश करता हूं तो मुझे एक एक्सएमएल संदेश (/ 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 खोज की। इससे मुझे स्प्रिंग सोर्स फोरम का नेतृत्व हुआ: http://forum.springsource.org/showthread.php?130684-OAuth2-No-adapter-for-handler-exception

यहां मैंने पाया कि बैनिफू में भी यही समस्या थी। डेव Syer इस तरह सवाल का जवाब:

ऐसा लगता है कि आप वेनिला sparklr से <mvc:annnotation-driven/> हटा दिया। मुझे लगता है कि अगर आप इसे वापस हैंडलर एडाप्टर में आपके लिए परिभाषित करेंगे।

वसंत सुरक्षा वसंत एमवीसी ढांचे पर अनुरोध और प्रतिक्रियाओं से निपटने के लिए निर्भर करती है। इसके लिए एमवीसी ढांचे को शामिल करने की आवश्यकता है और स्प्रिंग सुरक्षा ओएथ के लिए काम करने के लिए उचित रूप से सेटअप किया जाना चाहिए।

समाधान है कि मैं अपने आवेदन संदर्भ के लिए 2 टैग जोड़ है:

  • <mvc:annotation-driven />

MVC framwork एनोटेशन को संभालने के लिए तैयार करें। यह @FrameworkEndpoint ठीक से काम करता है। बाद में एक public class TokenEndpoint में इस्तेमाल किया जा रहा है, जो त्रुटि 500.

  • <mvc:default-servlet-handler />

यह हैंडलर डिफ़ॉल्ट सर्वलेट के सभी अनुरोधों को अग्रेषित करेंगे दे दी है। इसलिए यह महत्वपूर्ण है कि यह अन्य सभी यूआरएल हैंडलर मैपिंग के क्रम में आखिरी रहे। यदि आप <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

मुझे खुशी है कि ऐसे लोग भी हैं जो इस तरह के अपने प्रश्न का उत्तर देते हैं। इससे कोई फर्क नहीं पड़ता कि आपकी समस्या कितनी अस्पष्ट है, कम से कम एक अन्य उपयोगकर्ता एक ही चीज़ का अनुभव कर रहा है। अगर मैं आपको एक बियर खरीद सकता हूं, लेकिन कम से कम एक अपवॉट होगा :-) – Joe

+0

वर्टोंगन, मुझे एक ही समस्या थी, सभी संबंधित Google परिणाम पढ़े गए हैं, लेकिन केवल आपकी समस्या हल हो गई है, मेरे कोड से गायब था। अपने प्रश्न का उत्तर देने और मेरी मदद करने के लिए धन्यवाद! – szpetip

+0

आपका स्वागत है। मुझे खुशी है कि इस बार के बाद भी यह उपयोगी है। – Vertongen

संबंधित मुद्दे