2010-11-01 6 views
13

Simple question, मैं just need एक pointer में सही direction:कैसे को प्रक्रिया एक form login का उपयोग कर Spring Security/Spring MVC

मैं एक simple Spring MVC/Spring Security webapp। प्रारंभ में मैंने स्प्रिंग सिक्योरिटी की स्थापना की ताकि डिफ़ॉल्ट लॉगिन पेज सही तरीके से दिखाया जा सके और प्रमाणीकृत हो (मैंने UserDetailsService को DaoAuthenticationProvider के साथ ऐसा करने के लिए लागू किया)।

अगला चरण: मेरे लॉगिन पृष्ठ के साथ डिफ़ॉल्ट वसंत लॉगिन पृष्ठ को प्रतिस्थापित करें और प्रमाण पत्र पोस्ट करें।

लेकिन सबमिट किए गए लॉगिन प्रमाण-पत्रों के साथ मैं क्या करूँ? मुझे लगता है कि मैं फॉर्म को नियंत्रक को पोस्ट करता हूं, प्रमाण-पत्र सत्यापित करता हूं, लेकिन मैं स्पष्ट नहीं हूं कि उसके बाद सही कदम क्या है। उदा .:

  • क्या मैं प्रमाणीकरण प्रबंधक की विधि बुला रहा हूं?
  • क्या मुझे इसके लिए एक बीन परिभाषित करने की आवश्यकता है?
  • क्या कोई इंटरफ़ेस/सेवा है जिसे मुझे प्रमाणीकरण एंटरपॉइंट या कुछ की तरह कार्यान्वित करने की आवश्यकता है?

मैंने 3 बार दस्तावेज़ों को मारा है और उनका पालन नहीं किया है। मुझे पता है कि यह गंदगी सरल है, इसलिए मुझे बस यह सुनना होगा कि प्रक्रिया कैसे चलनी चाहिए।

+0

आप क्या हासिल करने की कोशिश कर रहे हैं? आप डिफ़ॉल्ट रूप से अपने स्वयं के फॉर्म का उपयोग करने के लिए बस स्प्रिंग सिक्योरिटी को कॉन्फ़िगर क्यों नहीं कर सकते? – axtavt

+0

आह हाँ, मैं यह कर सकता हूं, यह था कि वह मुझे कैसे मार रहा था। :) वसंत में कुछ करने के कई तरीके हैं और मैं विकल्पों के असंख्य के बीच खो गया हूं। आखिरकार मुझे <सुरक्षा: फॉर्म-लॉगिन ... /> का उपयोग करने के बारे में और अधिक स्पष्ट समझ की आवश्यकता थी। मुझे एहसास नहीं हुआ था कि यह वास्तव में लॉगिन-प्रोसेसिंग-यूआरएल पथ पर अनुरोधों को रोक देगा और उन्हें संभालेगा, मैं लॉगिन फॉर्म अनुरोधों को संभालने के लिए अपना स्वयं का नियंत्रक बनाने की कोशिश कर रहा था (एक सरल फॉर्म लॉगिन के लिए एक अनावश्यक कदम)। –

उत्तर

11

वसंत सुरक्षा reference documentation5.4 Authentication in a Web Application में मूल प्रसंस्करण प्रवाह की रूपरेखा तैयार करता है। बिंदु # 6:

अगला सर्वर यह तय करेगा कि प्रस्तुत किए गए प्रमाण-पत्र मान्य हैं या नहीं। यदि वे मान्य हैं, तो अगला कदम होगा। यदि वे अमान्य हैं, तो आमतौर पर आपके ब्राउज़र से फिर से प्रयास करने के लिए कहा जाएगा (ताकि आप ऊपर चरण 2 पर वापस आएं)।

...

स्प्रिंग सुरक्षा ऊपर वर्णित चरणों के अधिकांश के लिए जिम्मेदार अलग वर्गों है। मुख्य प्रतिभागियों (क्रम में उनका उपयोग किया जाता है) अपवाद ट्रांस्लेशन फ़िल्टर, एक प्रमाणीकरण एंटरपॉइंट और एक "प्रमाणीकरण तंत्र" है, जो कि पिछले अनुभाग में हमने प्रमाणीकरण प्रबंधक को कॉल करने के लिए ज़िम्मेदार है।

मैं स्वीकार करना होगा, प्रलेखन यहाँ एक सा तो भ्रमित मैं तुम्हें कुछ और संकेत दे देंगे - बात आप के बाद कर रहे हैं है "प्रमाणीकरण तंत्र" यहाँ उल्लेख किया है, यह साख के प्रसंस्करण के लिए जिम्मेदार है कि ब्राउज़र भेज रहा है।

HTTP अनुरोध (ओं) को साख संलग्न के विवरण के रूप में, विभिन्न प्रमाणीकरण तरीकों (प्रपत्र डेटा बनाम सादे हेडर बनाम हेडर को पचाने) के बीच काफी भिन्नता कोई आम "प्रमाणीकरण तंत्र" वहाँ है - इसके बजाय, प्रत्येक विधि अपने स्वयं के तंत्र को लागू करती है और वेब-आधारित प्रमाणीकरण के मामले में, यह आमतौर पर विशेष फ़िल्टर है जिसे आपको web.xml में कॉन्फ़िगर करना है।

आपके मामले में, आप शायद UsernamePasswordAuthenticationFilter में रुचि रखते हैं - इसका उपयोग मूल रूप-आधारित लॉगिन जानकारी पर प्रसंस्करण के लिए किया जाता है।

लॉगिन प्रपत्र बस j_username और j_password इनपुट फ़ील्ड, और पदों URL है, जो निगरानी रखी जाती है करने के लिए शामिल हैं: अपने कस्टम लॉगिन फार्म और फिल्टर के बीच अनुबंध URL (जहां प्रपत्र पोस्ट किया जाता है) + यूज़रनेम और पासवर्ड फ़ील्ड नाम है फ़िल्टर द्वारा (डिफ़ॉल्ट रूप से यह/j_spring_security_check है)।

+0

विस्तृत व्याख्या के लिए धन्यवाद। इससे मुझे अंत में समझने में मदद मिली कि टैग कैसे काम करता है। मुझे समझ में नहीं आया कि यह अनिवार्य रूप से एक नियंत्रक के रूप में काम करता है जहां यह वास्तव में लॉगिन-प्रसंस्करण-यूआरएल पर पोस्ट किए गए अनुरोधों को संभालता है, और मुझे j_username नामक पैरामीटर पारित करने की आवश्यकता होती है, और j_password –

+0

क्या आपको मेरी इसी तरह की विषय में मदद करने की ज़रूरत है? मैं जावा कॉन्फ़िगरेशन के साथ एक कस्टम लॉगिन प्रोसेसिंग विधि को कार्यान्वित करने की कोशिश कर रहा हूं, और मैं इस समस्या से फंस गया: http://stackoverflow.com/questions/22738738/my-plplication-with-spring-security-dont-go-beyond-login-page । किसी भी मदद बहुत आभारी होना चाहिए। –

1

हम एक ही समस्या के बारे में बात कर रहे हैं कम से कम, this is my approach चलो देखते हैं कि लोग क्या कहेंगे।

+0

क्या आप वहां वसंत सुरक्षा का उपयोग कर रहे हैं? मैं फॉर्म लॉगिन पर खो गया, लेकिन स्प्रिंग सिक्योरिटी (स्प्रिंग फ्रेमवर्क से एक अलग बंडल) द्वारा प्रदान किए गए मूल डिफ़ॉल्ट लॉगिन पेज के साथ आपको उपयोगकर्ता डिस्प्ले सेवा को लागू करने की आवश्यकता है, और वे दस्तावेज़ विशेष रूप से सत्र में किसी भी उपयोगकर्ता की जानकारी को संग्रहीत करने के खिलाफ कॉल करते हैं (उन्हें UserDetails ऑब्जेक्ट में संग्रहीत किया जाना चाहिए जिसे सुरक्षाContextHolder द्वारा नियंत्रित किया जाता है)। आप SecurityContextHolder के माध्यम से सब कुछ एक्सेस करेंगे, और यह निर्धारित करेंगे कि प्रमाणीकृत उपयोगकर्ता की एक विशिष्ट भूमिका है जिसे आपने UserDetails ऑब्जेक्ट में इसके लिए परिभाषित किया है। –

+0

असल में, मैं वर्तमान में किसी भी स्प्रिंग सुरक्षा ढांचे का उपयोग नहीं कर रहा हूं, लेकिन हो सकता है कि यह एक अच्छा विचार हो। मैं HTTP सत्र पर कुछ भी संग्रहीत नहीं कर रहा हूं क्योंकि जहां तक ​​मैं समझता हूं कि यह थ्रेड-सुरक्षित नहीं है। मैं इसे सत्र स्तर पर संग्रहीत कर रहा हूं। मैंने अभी तक फैसला नहीं किया है कि क्या यह वसंत सुरक्षा को लागू करने के लायक है और यह सुनना चाहेंगे कि गुरुओं को क्या कहना है। –

+0

वसंत सुरक्षा अच्छी है, और लागू करने के लिए बहुत मुश्किल नहीं है। मेरे लिए (मैं लगभग आपके जैसा ही परिदृश्य में हूं) यह काफी तार्किक लग रहा था। आप शायद इसे अपने आप को उतना ही करने के साथ झगड़ा करने जा रहे हैं जितना आप अतिरिक्त ढांचे को सीखेंगे, आप लंबे समय से अधिक समय तक आगे बढ़ेंगे। इसके बाद वहां विभिन्न प्रकार के सुरक्षा विकल्पों को लागू करना वास्तव में आसान है। मैं कम से कम दस्तावेज़ पढ़ने का सुझाव दूंगा। –

16

मैं एक स्पष्ट जवाब भविष्य में यह पढ़ किसी के लिए भी जोड़ देंगे:

जब आप वसंत सुरक्षा में टैग यह आप के लिए लॉगिन संभाल लेंगे परिभाषित करते हैं, मैं पर नज़र डालेंगे कि यह कैसे काम करता है विस्तार से (इच्छा यह इस डॉक्स में विस्तृत थे):

<security:http auto-config="true"> 
    <security:form-login login-page="/login" 
     login-processing-url="/postlogin" 
     default-target-url="/myaccount" 
     authentication-failure-url="/login?loginError=true" /> 
    <security:logout logout-url="/logout" /> 
</security:http> 

प्रवेश-पेज प्रवेश पृष्ठ का यूआरएल है। आपके पास एक नियंत्रक (या स्थैतिक HTML पृष्ठ) होना चाहिए जो इस पृष्ठ परोसता है, यह आपका सुंदर लॉगिन फ़ॉर्म है।

लॉगिन-प्रोसेसिंग-यूआरएल एक यूआरएल है जो फॉर्म-लॉगिन घटक हैंडल करता है। ऐसा लगता है कि फॉर्म-लॉगिन घटक ने इस पृष्ठ के लिए अपने नियंत्रक को लागू किया है। आपको इस पृष्ठ पर अपना फॉर्म पोस्ट करना चाहिए। आपको अपने उपयोगकर्ता नाम/पासवर्ड पैरामीटर "j_username" और "j_login" नाम देने के लिए भी जानना होगा "j_login"

इसके अलावा, और बाकी के उचित रूप से स्पष्ट विकल्प, आपको UserDetailsService लागू करना चाहिए था - यानी, एक कक्षा बनाएं किसी दिए गए उपयोगकर्ता नाम इंटरफेस UserDetailsService जो हो जाता है, और रिटर्न, एक UserDetails वस्तु (उपयोगकर्ता नाम/पासवर्ड) को लागू - और सुरक्षा विन्यास के बाकी के साथ प्रदान की है कि:

<security:authentication-manager> 
     <security:authentication-provider ref="daoAuthenticationProvider" /> 
</security:authentication-manager> 

<bean id="daoAuthenticationProvider" 
    class="org.springframework.security.authentication.dao.DaoAuthenticationProvider" > 
    <property name="userDetailsService" ref="myAuthorizationService" /> 
</bean> 
+0

यदि आप लॉगिन-प्रोसेसिंग-यूआरएल निर्दिष्ट नहीं करते हैं, तो लॉगिन-पेज मान डिफ़ॉल्ट रूप से उपयोग किया जाएगा, इसलिए लॉगिन फॉर्म को वहां पोस्ट करना होगा। (वसंत सुरक्षा 3.2.4) – xtian

+2

ध्यान दें कि वसंत सुरक्षा 4+ में उपयोगकर्ता नाम/पासवर्ड पैरामीटर अब "उपयोगकर्ता नाम" और "पासवर्ड" – DaveRlz

+0

पर डिफ़ॉल्ट हैं 'डिफ़ॉल्ट-लक्ष्य-यूआरएल' विशेषता का उपयोग क्या है? –

1

limc द्वारा पोस्ट करने देखें Ritesh के जवाब में Configuring Spring Security 3.x to have multiple entry points पर उत्तर का शीर्षक शीर्षक वाले अनुभागों को देखें:

अद्यतन 2011/01/29 - @ रितेश की तकनीक
अद्यतन - @ रितेश की तकनीक

का हल यह है कि कैसे आप स्प्रिंग सुरक्षा में प्रवेश प्रक्रिया अनुकूलित कर सकते हैं का एक संक्षिप्त, उन्नत अच्छा उदाहरण

1

हैं आप एक जेडीबीसी सुलभ डेटाबेस का उपयोग कर रहे हैं, तो आप निम्न प्रमाणीकरण-प्रदाता का उपयोग कर सकते हैं और एक कस्टम बनाने से बच सकते हैं। यह XML के 9 लाइनों के लिए आवश्यक कोड कटौती:

<authentication-provider> 
    <jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password from users where username=?" authorities-by-username-query="select u.username, r.authority from users u, roles r where u.userid = r.userid and u.username =?" /> 
</authentication-provider> 

फिर आप सेटअप अपने डेटा स्रोत के रूप में इस प्रकार है

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/DB_NAME" /> 
    <property name="username" value="root" /> 
    <property name="password" value="password" /> 
</bean> 

इस पोस्ट पर एक नज़र डालें कर सकते हैं: http://codehustler.org/blog/spring-security-tutorial-form-login/ यह सब कुछ आप जानना चाहते हैं को शामिल किया गया वसंत सुरक्षा फॉर्म-लॉगिन को अनुकूलित करने के बारे में।

1
<security:http auto-config="true"> 
    <security:form-login login-page="/login" 
    login-processing-url="/postlogin" 
    default-target-url="/myaccount" 
    authentication-failure-url="/login?loginError=true" /> 
    <security:logout logout-url="/logout" /> 
</security:http> 

प्रवेश-पेज लॉगिन प्रपत्र यूआरएल लॉगिन प्रसंस्करण-यूआरएल URL यहां लॉगिन फ़ॉर्म सबमिट किया जाता है। स्प्रिंग सुरक्षा -xml फ़ाइल में आपके द्वारा मैप किए गए प्रमाणीकरण-प्रबंधक को स्वयं कॉल करेगा।

प्रक्रिया

  1. आप एक वर्ग है कि ओवरराइड विधि प्रमाणीकरण प्रमाणित (प्रमाणीकरण प्रमाणीकरण)
  2. द्वितीय श्रेणी कि org.springframework.security फैली साथ org.springframework.security.authentication.AuthenticationProvider लागू करता है लिखने के लिए की जरूरत है। core.userdetails.UserDetailsService एक ओवरराइड विधि loadUserByUsername (स्ट्रिंग उपयोगकर्ता नाम)
  3. द्वितीय श्रेणी का फॉर्म जहां आप अपना डीएओ कॉल कर सकते हैं और उपयोगकर्ता नाम और पासवर्ड लाने वाले डेटाबेस के साथ उपयोगकर्ता को मान्य कर सकते हैं।
  4. प्रमाणीकरण प्रमाणीकरण (प्रमाणीकरण प्रमाणीकरण) में आप पासवर्ड की तुलना करेंगे और सफलतापूर्वक विफलता वापस कर देंगे।
संबंधित मुद्दे