2012-08-14 11 views
9

मेरे पास auto-config='true' के अनुसार मूल और फ़ॉर्म आधारित प्रमाणीकरण का उपयोग करके कॉन्फ़िगर किया गया स्प्रिंग-सुरक्षा है।मैं रीस्टफुल एंडपॉइंट्स के लिए वसंत फ़ॉर्म आधारित लॉगिन को कैसे अक्षम कर सकता हूं?

मैं फॉर्म आधारित सुरक्षा का उपयोग न करने के लिए /api/** के तहत एंडपॉइंट्स चाहता हूं। /api/** के बाहर अन्य अंत बिंदुओं को फॉर्म आधारित लॉगिन का उपयोग करना चाहिए। मुझे 401 प्रतिक्रिया इन अंतराल के लिए किसी भी कॉल पर भेजी गई है, जिन्होंने /api/** के तहत प्रमाण-पत्र प्रदान नहीं किए हैं।

अद्यतन: नीचे ल्यूक टेलर की टिप्पणी के लिए धन्यवाद, मैं निम्नलिखित समाधान के साथ आया हूं।

नोट: इस तकनीक को केवल वसंत-सुरक्षा 3.1 के रूप में लागू किया जा सकता।

सबसे पहले मैं /api/** बाहर एकल। यदि कोई उपलब्ध हो तो हम कभी भी सत्र नहीं बनाते हैं, इसे create-session="never" और <session-management/> का उपयोग किया जाता है।

<http pattern="/api/**" create-session="never" use-expressions="true"> 
    <http-basic /> 
    <session-management /> 
    <intercept-url pattern="/api/**" access="hasRole('API_ACCESS')"/> 
</http> 

<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern="/" access="permitAll"/> 
    <intercept-url pattern="/**" access="isAuthenticated()"/> 
</http> 
+1

यहां देखें http://www.baeldung.com/2011/10/31/securing-a-restful-web-service-with-spring-security-3-1-part-3/। इस ट्यूटोरियल में आप अपने सवालों पर कुछ जवाब पा सकते हैं। – dimas

+1

[मेरा प्रश्न] (http://stackoverflow.com/questions/9302795/handling-both-form-and-http-basic- प्रमाणीकरण-with- अलग-अलग स्रोतों) का मेरा जवाब देखें जो अनिवार्य रूप से वही बात पूछ रहा है। –

+0

हाय ल्यूक, सिद्धांत रूप में ऐसा लगता है कि मैं क्या कर रहा हूं और इसे लागू करने की जांच करूँगा। एकाधिक ' 'टैग होने में वे गलती से दोनों अनुरोध को संभाल सकते हैं? शायद मैं '/ api' के अलावा किसी भी चीज़ से मेल खाने के लिए स्पेल का उपयोग कर सकता हूं। मुझे पता नहीं था कि वसंत-सुरक्षा 3.1 में वे अब कई '' टैग की अनुमति देते हैं, यह एक अच्छी बात है। –

उत्तर

19

स्प्रिंग सुरक्षा 3.1 के साथ, अपने सबसे अच्छा विकल्प दो अलग-अलग <http> तत्वों का उपयोग करके अलग फिल्टर जंजीरों में अपने आवेदन के शोकहारा और गैर शोकहारा भागों विभाजित करने के लिए है। शेष API श्रृंखला को तब स्टेटलेस और मूल प्रमाणीकरण का उपयोग करने के लिए कॉन्फ़िगर किया जा सकता है, जबकि डिफ़ॉल्ट श्रृंखला सामान्य फॉर्म-लॉगिन कॉन्फ़िगरेशन का उपयोग कर सकती है।

फिर आप की तरह कुछ होगा:

<http pattern="/api/**" create-session="stateless"> 
    <intercept-url pattern="/api/**" access="ROLE_API_USER" /> 
    <http-basic />   
</http> 

<!-- No pattern attribute, so defaults to matching any request --> 
<http> 
    <intercept-url pattern="/**" access="ROLE_USER" /> 
    <form-login />   
</http> 

श्रृंखला परिभाषाएँ सबसे सामान्य करने के लिए सबसे विशिष्ट पैटर्न से आदेश दिया जाना चाहिए, ताकि डिफ़ॉल्ट श्रृंखला पिछले आता है।

+0

उत्कृष्ट ल्यूक, उत्तर पोस्ट करने के लिए बहुत बहुत धन्यवाद। मुझे इसे खोजने के लिए 3.1 के लिए दस्तावेज़ पढ़ना चाहिए क्योंकि यह एक छोटी लेकिन शक्तिशाली नई सुविधा है। :) –

+0

मुझे लगता है कि बनाने के सत्र विशेषता 'बनाने सत्र =" कभी नहीं "के लिए सेट किया जाना चाहिए' इस पोस्ट के अनुसार: http://stackoverflow.com/questions/16914985/spring-security-either-http-basic- या फार्म: प्रवेश के प्रमाणीकरण – lanoxx

+0

नहीं @lanoxx अगर आप चाहते हैं पूरी तरह से राज्यविहीन होने के लिए अपने आवेदन और एक सत्र की आवश्यकता नहीं है। –

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

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