2017-05-04 18 views
5

में स्प्रेल समर्थित नहीं है मैं स्प्रिंग डेटा एलडीएपी का उपयोग करता हूं और स्प्रिंग बूट एम्बेडेड अनबाउंड आईडी के लिए बॉक्स समर्थन से बाहर प्रदान करता है। हालांकि, जब मैं स्प्रिंग डेटा एलडीएपी के @Entry एनोटेशन का उपयोग करता हूं, तो मुझे एनोटेड अनबाउंडआईडी एलडीएपी सर्वर, या रिमोट एक्टिव डायरेक्टरी सर्वर का उपयोग कर रहा है या नहीं, इस पर आधारित एनोटेशन में मुझे एक अलग base निर्दिष्ट करना होगा।स्प्रिंग एनोटेशन @ Entry.base

मैं निर्दिष्ट द्वारा स्पेल और प्रोफाइल के आधार पर गुणों के साथ यह करने के लिए प्रयास किया गया था:

@Entry(base = "${ldap.person.base}", ...) 

तब मैं ldap.person.base=OU=AD Person Base के साथ एक application.propreties और ldap.person.base=OU=Embedded Person Base के साथ एक application-embedded.properties है।

javax.naming.InvalidNameException:

हालांकि, @Entry एनोटेशन स्पेल मूल्यांकन का समर्थन नहीं लगती अवैध नाम: $ {ldap.person.base}

एक open issue नहीं है वसंत एलडीएपी में इसके लिए समर्थन जोड़ने के लिए, लेकिन क्या कोई कामकाज है या कुछ अन्य तरीकों से मैं इसे पूरा कर सकता हूं जब तक कि यह वसंत एलडीएपी में समर्थित न हो?

+0

https://github.com/spring-projects/spring-ldap/issues/444 –

+0

@PavanKumarJorrigala में एक खुली समस्या है धन्यवाद - प्रश्न के लिए जोड़ा गया लिंक।मैंने अभी हाल ही में पाया है। –

उत्तर

1

पहली जगह में मुझे अलग-अलग base की आवश्यकता होने का कारण बताता है क्योंकि वसंत पर पर सेट नहीं कर रहा था।

जब आप करते हैं स्प्रिंग बूट एम्बेडेड LDAP सर्वर autoconfigure, यह EmbeddedLdapAutoConfiguration में इस तरह के रूप में एक ContextSource बनाता है:

@Bean 
@DependsOn("directoryServer") 
@ConditionalOnMissingBean 
public ContextSource ldapContextSource() { 
    LdapContextSource source = new LdapContextSource(); 
    if (hasCredentials(this.embeddedProperties.getCredential())) { 
     source.setUserDn(this.embeddedProperties.getCredential().getUsername()); 
     source.setPassword(this.embeddedProperties.getCredential().getPassword()); 
    } 
    source.setUrls(this.properties.determineUrls(this.environment)); 
    return source; 
} 

जैसा कि आप देख सकते हैं, वहाँ करता है कहीं नहीं में यह source.setBase() कहते हैं। तो यह हल करने के लिए, मैं @Profile("embedded") के साथ एक विन्यास फाइल जोड़ा गया है और स्वयं एक ContextSource बनाया जहाँ मैं base अपने आप सेट (मैं साख भाग को बंद रखना होगा क्योंकि मैं एम्बेडेड सर्वर के लिए क्रेडेंशियल्स का उपयोग नहीं करते हैं):

@Configuration 
@Profile("embedded") 
@EnableConfigurationProperties({ LdapProperties.class }) 
public class EmbeddedLdapConfig { 

    private final Environment environment; 
    private final LdapProperties properties; 

    public EmbeddedLdapConfig(final Environment environment, final LdapProperties properties) { 
     this.environment = environment; 
     this.properties = properties; 
    } 

    @Bean 
    @DependsOn("directoryServer") 
    public ContextSource ldapContextSource() { 
     final LdapContextSource source = new LdapContextSource(); 
     source.setUrls(this.properties.determineUrls(this.environment)); 
     source.setBase(this.properties.getBase()); 
     return source; 
    } 
} 

अब, मैं अपने @Entry में सक्रिय निर्देशिका सर्वर और एम्बेडेड अनबाउंड आईडी दोनों के लिए base विशेषता का मान छोड़ सकता हूं और यह ठीक से काम करता है।

+0

अच्छा काम यह काम कर रहा है! कृपया मेरे उत्तर को ऊपर उठाने पर विचार करें क्योंकि आपने स्पष्ट रूप से उस विधि का उपयोग किया है जिसे मैंने ठीक करने के लिए सुझाया था। –

2

मुझे यकीन है कि मैं यहाँ अनुसरण कर रहा हूँ, लेकिन आप स्प्रिंग बूट में LDAP ऑटो विन्यास का उपयोग कर रहे संभालने नहीं कर रहा हूँ, यह एक या अन्य (OU=AD Person Base या OU=Embedded Person Base) के लिए संपत्ति spring.ldap.base स्थापित करने के लिए पर्याप्त नहीं है आधारित प्रोफाइल पर आप उपयोग कर रहे हैं?

दोनों EmbeddedLdapAutoConfiguration और LdapAutoConfiguration सेम निर्माण के दौरान LdapContextSource पर विभिन्न विशेषताओं स्थापित करने के लिए, अपने base सहित एक LdapProperties वस्तु का उपयोग करें। जहां तक ​​मैं कह सकता हूं, LdapContextSource.base सेट होने पर आपको अपने कोडबेस में प्रत्येक @Entry के लिए इसे परिभाषित नहीं करना होगा।

यदि आप ऑटो कॉन्फ़िगरेशन का उपयोग नहीं कर रहे हैं, और यदि मैं अपनी धारणाओं में सही हूं, तो भी आपको अपनी खुद की LdapContextSource बीन बनाने में सक्षम होना चाहिए और वसंत संपत्ति के आधार पर वांछित मूल्य पर base सेट करना चाहिए।

+0

जब मैं ऐसा करता हूं, यह एम्बेडेड संस्करण में काम करता है, लेकिन मुझे 'javax.naming.PartialResultException: अनप्रचारित निरंतर संदर्भ (ओं) मिलता है; शेष नाम '/' 'जब अनुप्रयोग सक्रिय निर्देशिका के खिलाफ एक एलडीएपी खोज करता है। अगर मैं अपने 'व्यक्ति' प्रविष्टि में 'base =" OU = डोमेन उपयोगकर्ता "निर्दिष्ट करता हूं, तो यह काम करता है, लेकिन फिर यह एम्बेडेड संस्करण को तोड़ देता है। –

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