2010-02-17 13 views
5

आमतौर पर, जब आप अपने आवेदन (मेरे मामले में वेबएप) के लिए अलग-अलग "< प्रमाणीकरण-प्रदाता >" घोषित करते हैं, तो स्प्रिंग सुरक्षा विफलता के कारण एक दूसरे के बाद प्रदाताओं को आमंत्रित करने का ख्याल रखती है। तो, मेरे पास डेटाबेस प्रमाणीकरणप्रोवाइडर और LDAPAuthenticationProvider डेटाबेस प्रमाणीकरणप्रोवाइडर के साथ है, पहले कॉन्फ़िगरेशन फ़ाइल में रनटाइम पर घोषित किया गया है, डेटाबेस प्रमाणीकरणप्रदाता को पहले लागू किया गया है और यदि प्रमाणीकरण विफल हो जाता है, तो LDAP प्रमाणीकरण की कोशिश की जाती है। यह अच्छा है - हालांकि, मुझे जो रन चाहिए वह एक रनटाइम स्विच है।वसंत सुरक्षा के साथ रनटाइम पर प्रमाणीकरण दृष्टिकोण स्विच करना?

मैं इन दो दृष्टिकोणों (डेटाबेस आधारित प्रमाणीकरण/एलडीएपी आधारित प्रमाणीकरण) के बीच चयन करने का विकल्प चुनना चाहता हूं और किसी भी तरह से thsi वैश्विक सेटिंग के आधार पर कार्यान्वयन को स्विट कर सकता हूं।

मैं इसे कैसे कर सकता हूं? क्या वसंत-सुरक्षा के साथ भी यह संभव है?

उत्तर

4

मैं कैसे StackOverflow पर Googleland से उदाहरण के अन्य असंख्य करने के लिए अपने स्वयं के कस्टम प्रमाणीकरण प्रदाता इंजेक्षन और यहाँ करने के लिए छोड़ देंगे। ऐसा लगता है कि इसे एक्सएमएल के साथ एक विशेष बीन को चिह्नित करने के साथ करना है। लेकिन उम्मीद है कि मैं आपके लिए कुछ अन्य विवरण भर सकता हूं।

तो तुम कुछ हद तक ऊपर की तरह वर्ग परिभाषित किया है और मैं विवरण की अधिक है कि आप (यानी रूप में अच्छी तरह से सामान विलय वसंत के लिए की आवश्यकता होगी जोड़ देंगे।

public class SwitchingAuthenticationProvider implements AuthenticationProvider 
{ 
    .... 
    public List<AuthenticationProvider> getProviders() { return delegateList; } 
    public void setProviders(List<AuthenticationProvider> providers) { 
     this.delegateList = providers; 
    } 
    .... 
} 

यह अनुमति देगा आप वसंत का उपयोग कर प्रदाताओं में से एक मेजबान सुई:

<bean id="customAuthProvider1" class=".....CustomProvider1"> ... </bean> 
<bean id="customAuthProvider2" class=".....CustomProvider2"> ... </bean> 
... 
<bean id="customAuthProviderX" class=".....CustomProviderX"> ... </bean> 

<bean id="authenticationProvider" class="....SwitchingAuthenticationProvider"> 
    <security:custom-authentication-provider/> 
    <!-- using property injection (get/setProviders) in the bean class --> 
    <property name="providers"> 
     <list> 
      <ref local="customAuthProvider1"/> <!-- Ref of 1st authenticator --> 
      <ref local="customAuthProvider2"/> <!-- Ref of 2nd authenticator --> 
      ... 
      <ref local="customAuthProviderX"/> <!-- and so on for more --> 
     </list> 
    </property> 
</bean> 

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

मुझे बताएं कि यह आपके प्रश्न का उत्तर नहीं दे रहा है।

+0

@ मैट धन्यवाद। इससे मदद मिलती है। मैं इसे आज़माउंगा और आपको बता दूंगा। – Jay

3

एक प्रतिनिधि प्रमाणीकरण प्रदाता लिखने के बारे में जो जानता है कि आपके रनटाइम स्विच और डेटाबेस/एलडीएपी प्रमाणीकरणप्रदाता के वास्तविक उदाहरणों को कैसे पहुंचाया जाए।

मैं की तरह कुछ के बारे में सोच रहा हूँ:

public class SwitchingAuthenticationProvider implements AuthenticationProvider 
{ 
    private List<AuthenticationProvider> delegateList; 
    private int selectedProvider; 

    @Override 
    public Authentication authenticate(Authentication authentication) 
     throws AuthenticationException 
    { 
     AuthenticationProvider delegateTo = delegateList.get(selectedProvider); 
     return delegateTo.authenticate(authentication); 
    } 

    .... 
} 
+0

@ मैट यह अच्छा है। लेकिन, मैं प्रमाणीकरण प्रदाताओं की उस सूची को कैसे पॉप्युलेट करूं? – Jay

+0

@ मैट मुझे पता है कि यह एक बेवकूफ सवाल है, लेकिन मैं बस एक और वसंत नौसिखिया हूँ। – Jay

+0

जय, मैं कुछ और विवरण के साथ बाद में लिखूंगा, लेकिन आप उन्हें अपने स्विचिंग प्रमाणीकरणप्रदाता में केवल एक और वसंत बीन के रूप में इंजेक्ट कर सकते हैं। – Matt

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