2013-03-20 12 views
5

मैं यूआरएल के दो सेट के लिए अलग विन्यास - एक सेट बाकी एपीआई, दूसरा एक है - बहुत साधारण वेबसाइट है। मैं इतना है कि उपयोगकर्ता/लिपि कि कभी कभी REST API लागू या तो 401 कोड (मूल प्रमाणीकरण ठीक होगा) के साथ जवाब दिया जाएगा बाकी एपीआई के लिए विभिन्न सुरक्षा नियम लागू करना चाहते हैं - या सिर्फ 403स्प्रिंग सुरक्षा - REST API और अन्य URL

तो मैं अनुमति देना चाहते हैं

  • उपयोगकर्ता कि (साइट पेज कि REST API का आह्वान इस प्रकार एक ही सत्र के शेयरों पर जावास्क्रिप्ट के लिए) में लॉग इन कर दिया गया है के लिए बाकी API तक पहुंच।
  • कुछ स्क्रिप्ट जो डब्ल्यूडब्ल्यूडब्लू-प्रमाणीकरण हेडर में बुनियादी लेख प्रमाण-पत्रों के साथ आरईएसटी एपीआई को आमंत्रित करती है।

फिलहाल मैं यह पता लगाने की कोशिश कर रहा हूं कि कौन सी कॉन्फ़िगरेशन वसंत को "समझने" के बारे में बताएगा। मैं निम्नलिखित config के साथ आया था:

<beans:beans xmlns="http://www.springframework.org/schema/security" 
      xmlns:beans="http://www.springframework.org/schema/beans" 
      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 pattern="/" security="none" /> 
    <http pattern="/static/**" security="none" /> 

    <!-- REST API --> 
    <http pattern="/rest/*" use-expressions="true"> 
     <http-basic /> 
     <intercept-url pattern="/*" access="isAuthenticated()" /> 
    </http> 

    <!-- Site --> 
    <http access-denied-page="/WEB-INF/views/errors/403.jsp" use-expressions="true"> 
     <intercept-url pattern="/index.html" access="hasRole('ROLE_USER') or hasRole('ROLE_ANONYMOUS')" /> 
     <intercept-url pattern="/login.html" access="hasRole('ROLE_USER') or hasRole('ROLE_ANONYMOUS')" /> 
     <intercept-url pattern="/admin/*" access="hasRole('ROLE_ADMIN')" /> 
     <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 
     <form-login login-page="/login.html" 
        default-target-url="/index.html" 
        authentication-failure-url="/login.html?error=1" /> 

     <logout logout-url="/logout.do" logout-success-url="/index.html" /> 

     <anonymous username="guest" granted-authority="ROLE_ANONYMOUS" /> 
     <remember-me /> 
    </http> 

    <authentication-manager> 
     <authentication-provider> 
      <user-service> 
       <user name="admin" password="2" authorities="ROLE_ADMIN,ROLE_USER" /> 
       <user name="alex" password="1" authorities="ROLE_USER" /> 
      </user-service> 
     </authentication-provider> 
    </authentication-manager> 
</beans:beans> 

दुर्भाग्य से न केवल बुनियादी प्रमाणीकरण इस config साथ काम नहीं करता लेकिन वहाँ है अनाम उपयोगकर्ता द्वारा किए गए अनुरोध के लिए कोई 403 प्रतिक्रियाएं - रीडायरेक्ट 302 मिली के साथ आवेदन के जवाब जो मैं था आरईएसटी एपीआई यूआरएल के लिए अस्वीकार करना पसंद है।

मैं REST API के लिए कस्टम प्रवेश बिंदु जोड़ने की कोशिश की:

<beans:bean id="ep403" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/> 


<!-- REST API --> 
<http pattern="/rest/*" entry-point-ref="ep403" use-expressions="true"> 
    <intercept-url pattern="/*" access="hasRole('ROLE_USER')" /> 
    <http-basic /> 
</http> 

लेकिन यह या तो काम नहीं करता।

सारांश में मैं क्या प्राप्त करना चाहते है:

  • (प्राधिकरण सुविधा एक खाते में कुकीज़ में उपयोगकर्ता सत्र लेना चाहिए) अधिकृत उपयोगकर्ता REST API एक्सेस करने दें।
  • स्क्रिप्ट को रीस्ट एपीआई तक पहुंचने की अनुमति दें यदि यह सही प्रमाणीकरण टोकन निर्दिष्ट करता है और कुकीज़ में सत्र निर्दिष्ट नहीं करता है।

अद्यतन

स्प्रिंग सुरक्षा internals की खुदाई के बाद मैं कोड कुछ अनुरोध या नहीं अस्वीकार करने के लिए है कि क्या फैसला करता है कि पाया। यह एक तथाकथित "एक्सेस निर्णय मतदाता" है, मूल रूप से उनमें से सभी कुछ अनुरोध पर लागू होते हैं और यदि किसी संसाधन के वोट में एक निर्णय निर्णय मतदाता कुछ संसाधनों तक पहुंच से इनकार करने के लिए अनुरोध को अंततः अस्वीकार कर दिया जाता है।

इसलिए मूल समस्या विशेष पहुँच निर्णय मतदाता कि निम्नलिखित तरीके से बर्ताव करता है शुरू करने से हल किया जा सकता है: यह (यदि अनुरोध में किसी भी वर्तमान) और इस भूमिका के साथ प्राधिकरण चरण पर आय सत्र से जुड़े भूमिका को निकालने के लिए कोशिश करता है; यदि कोई सत्र मौजूद नहीं है तो यह उपयोगकर्ता को WWW- प्रमाणीकरण शीर्षलेख में प्रमाण-पत्रों के विरुद्ध प्रमाणीकृत करने का प्रयास करता है और फिर दिए गए उपयोगकर्ता से जुड़ी भूमिकाओं के साथ प्राधिकरण चरण तक पहुंच जाता है।

उत्तर

3

पुनः पोस्टिंग देख सकते हैं नीले @ सुझाव के रूप में :) उम्मीद है कि यह किसी को मदद मिलेगी।

मुझे इसके लिए एक सरल कामकाज मिला। मैं सिर्फ यूआरएल की दो अलग-अलग सेट करने के लिए एक आराम नियंत्रक मैप किया और वसंत सुरक्षा config में अलग प्रमाणन हैंडलर के लिए प्रत्येक सेट सौंपा:

<!-- Defines custom security policy for Stateful REST API --> 
<beans:bean id="nonRedirectingAccessDeniedHandler" class="org.springframework.security.web.access.AccessDeniedHandlerImpl"/> 
<beans:bean id="forbiddenEntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/> 

<!-- Stateful REST API --> 
<http pattern="/rest/stateful/**" use-expressions="true" entry-point-ref="forbiddenEntryPoint"> 
    <access-denied-handler ref="nonRedirectingAccessDeniedHandler"/> 
    <intercept-url pattern="/rest/stateful/**" access="isAuthenticated()" /> 
</http> 

<!-- Stateless REST API --> 
<http pattern="/rest/stateless/**" use-expressions="true" create-session="stateless"> 
    <http-basic/> 
    <intercept-url pattern="/rest/stateless/**" access="isAuthenticated()" /> 
</http> 

यह है कि समस्या की वजह से भविष्य में आप कर सकते हैं के लिए एक अच्छा दृष्टिकोण की तरह दिखता है उपयोगकर्ता या स्क्रिप्ट उपयोग मामलों के लिए विशिष्ट अद्वितीय URL के साथ या तो "स्टेटफुलर" -सर या "स्टेटलेस" -स्क्रिप्ट रीस्ट एपीआई का विस्तार करें।

मेरे मामले में यह तब हो सकता है जब यूएक्स परिवर्तनों को एक विशेष यूआई परिदृश्य को लागू करने के लिए डिज़ाइन की गई कुछ नई विधियों को प्रदान करने के लिए आरईएसटी एपीआई की आवश्यकता होगी और कुछ स्क्रिप्ट परिदृश्य में कुछ क्लाइंट स्क्रिप्ट-टू-सर्वर इंटरैक्शन का समर्थन करने के लिए पूरी तरह से जोड़े गए कुछ यूआरएल की आवश्यकता हो सकती है।

0

बाकी एपीआई के लिए pattern="/**" को pattern="/rest/**" और pattern="/*" को pattern="/rest/*" बदलने के लिए प्रयास करें:

<http pattern="/rest/**" use-expressions="true"> 
    <intercept-url pattern="/**" access="isAuthenticated()" /> 
    <http-basic /> 
</http> 
+0

धन्यवाद, सत्र-सत्र चाल करता है, लेकिन हालांकि यह मूल लेख काम करता है, सत्र द्वारा प्रमाणीकरण कार्य करने से इंकार कर देता है (दूसरे शब्दों में पृष्ठ पर जावास्क्रिप्ट आरईएसटी एपीआई तक पहुंचने में सक्षम नहीं होगा)। – Alex

+0

हां यह सच है। बदलते पैटर्न सहायक थे? –

+0

पैटर्न का अब कोई प्रभाव नहीं है क्योंकि अब मेरे पास एक बहुत ही सरल आरईएसटी एपीआई यूआरएल योजना है (जैसे/बाकी/पुस्तक? नाम = एक्स - फिलहाल मैं ऑथ बोझ से फंस गया हूं और मैं इसे विस्तारित करने के बारे में नहीं सोचता) । निस्संदेह मेरा पैटर्न गहरे घोंसले के साथ यूआरएल के लिए काम नहीं करेगा जैसे/आराम/एक/दो, इसे इंगित करने के लिए धन्यवाद। create-session = "stateless" दोनों पैटर्न के लिए मूल लेख काम करता है लेकिन यह वसंत दोनों पैटर्न के लिए मौजूदा अधिकृत सत्र को अनदेखा करता है। – Alex

2

आप /rest/ पैटर्न होने URL पर गौर करने इंटरसेप्टर का उपयोग कर सकते हैं।

<mvc:interceptors> 
     <mvc:interceptor> 
      <mvc:mapping path="/rest/**"/> 
      <bean class="com.your.class.name.Interceptor></bean> 
     </mvc:interceptor> 
</mvc:interceptors> 

इस XML के हैडर भाग में नीचे पंक्ति जोड़ने के लिए, अर्थात

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 

अब Interceptor वर्ग की जांच में जो कुछ भी आप की जरूरत है और इस वर्ग के वसंत HandlerInterceptor लागू करना चाहिए।

public class Interceptor implements HandlerInterceptor{ 

    @Override 
    public boolean preHandle(HttpServletRequest request, 
          HttpServletResponse response, 
          Object handler) throws Exception { 
     //do what you need to check when the request arrives 
     //do authentications here 
     //return true if success 
     //else false 
    } 

    @Override 
    public void postHandle(HttpServletRequest request, 
          HttpServletResponse response, 
          Object handler, 
          ModelAndView modelAndView) throws Exception { 

    } 

    @Override 
    public void afterCompletion(HttpServletRequest request, 
           HttpServletResponse response, 
           Object handler, 
           Exception ex) throws Exception {  
    } 

} 

विधियों के बारे में अधिक जानकारी के लिए this पढ़ें। इसके अलावा एक समाधान के रूप this

+0

मुझे यकीन नहीं है कि मुझे आपको काफी सही मिला है। यदि मैं आपके दृष्टिकोण को सही समझता हूं तो मुझे प्रस्तावित इंटरसेप्टर में सभी आवश्यक प्राधिकरण तर्क लागू करने की आवश्यकता होगी, इस प्रकार सुरक्षा कॉन्फ़िगरेशन सुरक्षा-context.xml और ऐसे कस्टम इंटरसेप्टर में फैल जाएगा। थोड़ा डरावना लग रहा है। खैर, अगर यह एकमात्र समाधान है, तो मैं REST URL के संबंध में प्रमाणीकरण और प्रमाणीकरण के लिए अपने दृष्टिकोण पर पुनर्विचार करना चाहता हूं। – Alex

+0

हां आपको यह सही मिला .. आप कैसे अधिकृत रूप से प्राधिकरण कर रहे हैं ?? – Anubhab

+0

फिलहाल मैं लोड बैलेंसर पक्ष पर ऐसा करने के बारे में सोच रहा हूं। यह पालन करने के लिए काफी कठिन और नाजुक दृष्टिकोण है, लेकिन यह सिर्फ काम करता है। साथ ही मैं सक्रिय रूप से इस समस्या के लिए पर्याप्त वसंत सुरक्षा-केवल समाधान की खोज कर रहा हूं। हो सकता है कि मैं अपने दृष्टिकोण पर पुनर्विचार करूँगा कि मैं मूल लेख छोड़ दूंगा और आरईएसटी एपीआई का उपयोग करने वाली स्क्रिप्ट के लिए अलग लॉगिन यूआरएल शामिल करूंगा। – Alex

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