2013-02-27 138 views
15

हम स्प्रिंग सुरक्षा OAuth2 के साथ हमारी आरईएसटी सेवाओं (सर्वर से सर्वर संचार के लिए, कोई उपयोगकर्ता शामिल नहीं) सुरक्षित करते हैं। लेकिन जब एक एक ब्राउज़र में एक संरक्षित संसाधन का उपयोग करने की कोशिश करता है, यह दिखाएगा:स्प्रिंग सुरक्षा सुरक्षितता OAuth 2 त्रुटि आउटपुट (अनधिकृत)

<oauth> 
    <error_description> 
     An Authentication object was not found in the SecurityContext 
    </error_description> 
    <error>unauthorized</error> 
</oauth> 

हम इस हमारे अपने को चुनने के एक कस्टम पृष्ठ होना चाहता हूँ। क्या उधर रास्ता है?

एक्सेस-इनकार-पेज सेट करना नहीं होगा। एक के लिए इसे एक लॉगिन पेज की परिभाषा की आवश्यकता होती है जो हमारे पास नहीं है क्योंकि यह सर्वर संचार के लिए एक शुद्ध सर्वर है। एक और के लिए इस विशेषता को स्प्रिंग 3.0 .. या कुछ के बाद माना जाता है।

वैसे भी .. OAuth त्रुटि हैंडलिंग में अपना रास्ता डीबग किया। और पाया कि प्रतिक्रिया किसी भी तरह से त्रुटि पृष्ठ पर दिखाई देने वाली जानकारी से समृद्ध हो जाती है। स्पष्ट रूप से कोई पृष्ठ प्रतिपादन बिल्कुल नहीं किया गया है, ऐसा लगता है कि प्रतिस्थापित करने के लिए कोई त्रुटि पृष्ठ नहीं है ..?

कम से कम हम इस तथ्य को छिपाना चाहते हैं कि हम ओएथ का उपयोग करते हैं और यदि हमारे पास "असली" पृष्ठ नहीं हो सकता है तो बस एक मूल "अस्वीकृत" टेक्स्ट प्रदर्शित करें .. तो शायद मुझे वसंत सुरक्षा हैंडलर का विस्तार करना होगा या प्रतिक्रिया को संशोधित करने के लिए एक कस्टम फ़िल्टर जोड़ें ?!

शायद हमारे त्रुटि पृष्ठ पर एक रीडायरेक्ट हो सकता है?

धन्यवाद!

संपादित

हमारे मौजूदा सेटअप जांच के लिए my other SO question here

+0

मैं उस समय एक ही काम करने की कोशिश कर रहा हूं। सुनिश्चित नहीं है कि अभी तक, यदि आपको कोई समाधान मिला है, तो कृपया साझा करें। मुझे यह पता चला है (नीचे लिंक) फोरम चर्चा, और ऐसा लगता है कि इसे RestTemplate के हैंडलर का उपयोग करने के साथ कुछ करना है ... http://forum.springsource.org/showthread.php?132846- सुरक्षित-REST-with-OAuth2 - प्रमाणीकरण-ऑब्जेक्ट-इन-द-सिक्योरिटी कॉन्टेक्स्ट – rafaelxy

+0

मुझे लगता है कि अब मुझे समझ में आया है, ओएथ सर्वर त्रुटि और रीडायरेक्ट को संभाल नहीं पाएगा, यह प्रमाणित करने की कोशिश कर रहे क्लाइंट एप्लिकेशन की ज़िम्मेदारी है। क्या मैं सही हू? – rafaelxy

+0

अब मैं नहीं हूं कि यह ओएथ के साथ काम करेगा लेकिन यह काम नहीं करेगा? <सुरक्षा: http> <सुरक्षा: एक्सेस-इनकार-हैंडलर त्रुटि-पृष्ठ = "/ 403-error.jsp" />

उत्तर

13

मैं भी OAuth विस्तार को दूर करने के लिए किया था और मेरे समाधान अपने ही OAuth2ExceptionRenderer लागू करने के लिए

package org.some.nice.code; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import org.springframework.http.HttpEntity; 
import org.springframework.http.HttpHeaders; 
import org.springframework.http.HttpInputMessage; 
import org.springframework.http.HttpOutputMessage; 
import org.springframework.http.ResponseEntity; 
import org.springframework.http.server.ServerHttpResponse; 
import org.springframework.http.server.ServletServerHttpRequest; 
import org.springframework.http.server.ServletServerHttpResponse; 
import org.springframework.security.oauth2.provider.error.OAuth2ExceptionRenderer; 
import org.springframework.web.context.request.NativeWebRequest; 
import org.springframework.web.context.request.ServletWebRequest; 

public class HeaderOnlyOAuth2ExceptionRenderer implements OAuth2ExceptionRenderer 
{ 
    private final Log logger = LogFactory 
      .getLog(MyOAuth2ExceptionRenderer.class); 

    public void handleHttpEntityResponse(HttpEntity<?> responseEntity, 
      ServletWebRequest webRequest) throws Exception 
    { 
     if (responseEntity == null) 
     { 
      return; 
     } 
     HttpInputMessage inputMessage = createHttpInputMessage(webRequest); 
     HttpOutputMessage outputMessage = createHttpOutputMessage(webRequest); 
     logger.info("filtering headers only..."); 
     if (responseEntity instanceof ResponseEntity 
       && outputMessage instanceof ServerHttpResponse) 
     { 
      ((ServerHttpResponse) outputMessage) 
        .setStatusCode(((ResponseEntity<?>) responseEntity) 
          .getStatusCode()); 
     } 
     HttpHeaders entityHeaders = responseEntity.getHeaders(); 
     if (!entityHeaders.isEmpty()) 
     { 
      outputMessage.getHeaders().putAll(entityHeaders); 
     } 
    } 

    private HttpInputMessage createHttpInputMessage(NativeWebRequest webRequest) 
      throws Exception 
    { 
     HttpServletRequest servletRequest = webRequest 
       .getNativeRequest(HttpServletRequest.class); 
     return new ServletServerHttpRequest(servletRequest); 
    } 

    private HttpOutputMessage createHttpOutputMessage(
      NativeWebRequest webRequest) throws Exception 
    { 
     HttpServletResponse servletResponse = (HttpServletResponse) webRequest 
       .getNativeResponse(); 
     return new ServletServerHttpResponse(servletResponse); 
    } 
} 

तो फिर तुम करना होगा था इसे अपने वसंत संदर्भ में संदर्भित करें

 <bean id="oauthAuthenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint"> 
     <property name="realmName" value="theRealm" /> 
<property name="exceptionRenderer" ref="headerOnlyExceptionRender" /> 
    </bean> 

    <bean id="clientAuthenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint"> 
     <property name="realmName" value="theRealm/client" /> 
     <property name="typeName" value="Basic" /> 
<property name="exceptionRenderer" ref="headerOnlyExceptionRender" /> 
    </bean> 



    <bean id="oauthAccessDeniedHandler" class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler"> 
<property name="exceptionRenderer" ref="headerOnlyExceptionRender" /> 
</bean> 


    <bean id="headerOnlyExceptionRender" class="org.some.nice.code.HeaderOnlyOAuth2ExceptionRenderer"/> 

उम्मीद है कि यह मदद करता है।

+0

धन्यवाद! तो जैसा मैंने सोचा था .. आपके समाधान के रूप में कोशिश करेंगे – Pete