2013-05-09 5 views
5

मेरे पास स्प्रिंग सुरक्षा एलडीएपी सर्वर के खिलाफ प्रमाणित करने के लिए कॉन्फ़िगर किया गया है।स्प्रिंग एलडीएपी प्रमाणीकरण और स्थानीय डेटाबेस से लोड भूमिका

<security:authentication-manager > 
    <security:ldap-authentication-provider user-dn-pattern="uid={0}" /> 

</security:authentication-manager> 

प्रमाणीकरण के बाद मैं उसी उपयोगकर्ता के लिए स्थानीय डेटाबेस से भूमिका लोड करना चाहता हूं। मैं "ldap-प्रमाणीकरण-प्रदाता" का उपयोग कर स्थानीय डेटाबेस भूमिकाओं को कैसे लोड कर सकता हूं?

मैं नीचे के रूप में दूसरा प्रमाणीकरण प्रदाता जोड़ते हैं:

<security:authentication-manager > 
    <security:ldap-authentication-provider user-dn-pattern="uid={0}" /> 
      <security:authentication-provider ref="daoAuthenticationProvider" /> 
</security:authentication-manager> 

daoAuthenticationProvider जोड़ा है, लेकिन जब पहली प्रमाणन प्रदाता उपयोगकर्ता प्रमाणित करता है वसंत दूसरा प्रदाता का उपयोग नहीं करता है। केवल अगर पहला लेख प्रदाता प्रमाणित करने में विफल रहता है तो यह सूची में अगला हो जाता है।

तो मूल रूप से देखने के लिए जैसे हम अनुकूलित करने के लिए

<security:ldap-authentication-provider user-dn-pattern="uid={0}" /> 

स्थानीय डेटाबेस से भूमिकाओं को लोड करने के लिए है।

कोई सुझाव? इसे कैसे लागू किया जाना चाहिए?

उत्तर

5

एक प्रमाणीकरण प्रदाता को सफल प्रमाणीकरण पर पूरी तरह से आबादी वाले प्रमाणीकरण टोकन वितरित करना होगा, इसलिए उपयोगकर्ता के प्रमाण-पत्रों की जांच करने के लिए एक प्रदाता का उपयोग करना संभव नहीं है, और दूसरा इसे प्राधिकरण (भूमिकाएं) सौंपने के लिए संभव नहीं है।

हालांकि आप डिफ़ॉल्ट व्यवहार के बजाय डेटाबेस से उपयोगकर्ता भूमिकाओं को लाने के लिए ldap auth प्रदाता को अनुकूलित कर सकते हैं (उपयोगकर्ता के समूहों को ldap में खोजना)। LdapAuthenticationProvider में दो रणनीतियों को इंजेक्शन दिया गया है: वह प्रमाणीकरण स्वयं करता है (LdapAuthenticator), और दूसरा उपयोगकर्ता जो उपयोगकर्ता के अधिकारियों को प्राप्त करता है (LdapAuthoritiesPopulator)। यदि आप LdapAuthoritiesPopulator कार्यान्वयन की आपूर्ति करते हैं जो डेटाबेस से भूमिकाएं लोड करता है तो आप अपनी आवश्यकताओं को प्राप्त कर सकते हैं। यदि आपके पास पहले से UserDetailsService डेटाबेस के विरुद्ध काम कर रहा है, तो आप उसे UserDetailsServiceLdapAuthoritiesPopulator में लपेटकर और इसे LdapAuthenticationProvider में इंजेक्शन करके आसानी से एकीकृत कर सकते हैं।

चूंकि यह कॉन्फ़िगरेशन असामान्य है, इसलिए सुरक्षा xml नेमस्पेस इसे सेट करने के लिए टैग/विशेषताओं को प्रदान नहीं करता है, लेकिन कच्ची बीन कॉन्फ़िगरेशन बहुत जटिल नहीं है। यहां रूपरेखा है:

1) मुझे लगता है कि आपके पास आपकी कॉन्फ़िगरेशन में ldap-server है। इसे असाइन करना और id पर महत्वपूर्ण है, जो हमें बाद में संदर्भित करने की अनुमति देगा।

<security:ldap-server url="..." id="ldapServer" .../> 

2) authentication-manager अनुभाग से, आप केवल अनुकूलित प्रदाता के पास भेजेगा:

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

3) अब, अनिवार्य हिस्सा:

authenticator मूल रूप से है नामस्थान कॉन्फ़िगरेशन द्वारा बनाए गए एक के समान। (contextSource एलडीएपी सर्वर का संदर्भ देने वाली विशेषता नोट करें।)

authoritiesPopulator आपके userService कार्यान्वयन के आसपास एक साधारण रैपर है जिसे आपकी कॉन्फ़िगरेशन में कहीं भी परिभाषित किया जाना चाहिए।

+0

यह वही है जो मैं ढूंढ रहा था। – user2072797

+0

क्या उपयोगकर्ता को उपयोगकर्ता आईडी जोड़ने का कोई तरीका है। उपयोगकर्ता ऑब्जेक्ट में ldap से userId विशेषता में empId नक्शा। – user2072797

+0

यह प्रश्न मूल के साथ असंबंधित प्रतीत होता है। यह संभवतः बेहतर है यदि आप इसे दोबारा सुधारते हैं और एक नए प्रश्न के रूप में पोस्ट करते हैं, क्योंकि इस समय मैं केवल इसे देख सकता हूं (व्यावहारिक रूप से), जबकि अन्य उपयोगकर्ता आपको बेहतर उत्तर देने में सक्षम हो सकते हैं। वैसे भी, ldap से डीबी तक उपयोगकर्ता विशेषताओं को मैप करना बिल्कुल संभव है, लेकिन ऐसा कुछ नहीं है जो आप स्प्रिंग सिक्योरिटी के साथ कर सकते हैं। – zagyi

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