2012-05-07 14 views
10

मैंने एक एलडीएपी सर्वर के साथ वसंत सुरक्षा कॉन्फ़िगर की है (लेकिन पढ़ना जारी रखें, अगर आपको इसके बारे में कोई जानकारी नहीं है तो यह कोई समस्या नहीं है, यह वास्तव में एक वसंत समस्या है)। सभी एक आकर्षण की तरह चलता है।वसंत, संपत्ति फ़ाइल, खाली मूल्य

<ldap-server ldif="classpath://ldap.ldif" root="dc=springframework,dc=org" manager-dn="" manager-password="" url="" id="ldapServer" /> 

अगर मैं अन्य क्षेत्रों को भरने, यह एक दूर के सर्वर चलेंगे:

<ldap-server ldif="" root="" manager-dn="" manager-password="" url="" id="ldapServer" /> 

अगर मैं LDIF और जड़ विशेषताओं को भरने, यह एक embeded सर्वर चलेंगे: यहाँ लाइन मुझे लगता है कि के लिए उपयोग है :

<ldap-server ldif="" root="" manager-dn="dc=admin,dc=springframeworg,dc=org" manager-password="password" url="ldap://myldapserver.com/dc=springframeworg,dc=org" id="ldapServer" /> 

ये सभी चीज़ें सही ढंग से चलती हैं।

तो मैं इस तरह विशेषता मान की जगह:

<ldap-server ldif="${ldap.ldif.path}" root="${ldap.ldif.root}" manager-dn="${ldap.server.manager.dn}" manager-password="${ldap.server.manager.password}" url="${ldap.server.url}" id="ldapServer" /> 

और के साथ एक संपत्ति फ़ाइल बनाने:

ldap.server.url= 
ldap.server.manager.dn= 
ldap.server.manager.password= 

ldap.ldif.path= 
ldap.ldif.root= 

अब अब मैं एक संपत्ति फ़ाइल से इस तरह के मानकों को लोड करने के लिए स्प्रिंग तंत्र का उपयोग करना चाहते , समस्या का मजाकिया हिस्सा। यदि मैं फ़ाइल में निम्न गुणों को भरता हूं:

ldap.server.url=ldap://myldapserver.com/dc=springframeworg,dc=org 
ldap.server.manager.dn=dc=admin,dc=springframeworg,dc=org 
ldap.server.manager.password=password 

ldap.ldif.path= 
ldap.ldif.root= 

यह अपेक्षाकृत दूरस्थ सर्वर चलाता है।

अगर मैं इस तरह संपत्ति फ़ाइल को भरने:

ldap.server.url= 
ldap.server.manager.dn= 
ldap.server.manager.password= 

ldap.ldif.path= classpath:ldap.ldif 
ldap.ldif.root= dc=springframeworg,dc=org 

यह नहीं चलता है शिकायत की कि ldap यूआरएल याद आ रही है। लेकिन समस्या यह है कि मैं से वसंत कॉन्फ़िगरेशन बदल सकते हैं: करने के लिए

<ldap-server ldif="${ldap.ldif.path}" root="${ldap.ldif.root}" manager-dn="${ldap.server.manager.dn}" manager-password="${ldap.server.manager.password}" url="${ldap.server.url}" id="ldapServer" /> 

<ldap-server ldif="${ldap.ldif.path}" root="${ldap.ldif.root}" manager-dn="${ldap.server.manager.dn}" manager-password="${ldap.server.manager.password}" url="" id="ldapServer" /> 

यह चलाता है (बस चर $ करने के लिए {ldap.server.url} संदर्भ को हटाने के द्वारा)!

मेरी यद्यपि यह है कि वसंत संपत्ति कॉन्फ़िगरेशन के साथ विशेषता मान को प्रतिस्थापित नहीं करता है यदि यह खाली है। लेकिन मुझे यह अजीब लगता है।

क्या आप मुझे समझने के लिए कुछ सुराग दे सकते हैं? और एक संपत्ति फ़ाइल के माध्यम से मेरे ldap सर्वर को कॉन्फ़िगर करने के लिए सबसे अच्छा क्या है?

संपादित करें: यह एक गरीब डिजाइन पसंद की वजह से है (स्वीकार किए जाते हैं जवाब को देखो), एक मुद्दा jira पर खोल दिया गया है: https://jira.springsource.org/browse/SEC-1966

+0

आप वसंत के किन संस्करणों का प्रयोग करते हैं? – Roadrunner

+0

यह 3.0.5.RELEASE –

उत्तर

2

ठीक है, मुझे लगता है कि यह वसंत सुरक्षा बग है।

यदि मैं डीडीग करता हूं और कक्षा LdapServerBeanDefinition कक्षा को देखता हूं, तो "पार्स" नामक एक विधि होती है।

public BeanDefinition parse(Element elt, ParserContext parserContext) { 
    String url = elt.getAttribute(ATT_URL); 

    RootBeanDefinition contextSource; 

    if (!StringUtils.hasText(url)) { 
     contextSource = createEmbeddedServer(elt, parserContext); 
    } else { 
     contextSource = new RootBeanDefinition(); 
     contextSource.setBeanClassName(CONTEXT_SOURCE_CLASS); 
     contextSource.getConstructorArgumentValues().addIndexedArgumentValue(0, url); 
    } 

    contextSource.setSource(parserContext.extractSource(elt)); 

    String managerDn = elt.getAttribute(ATT_PRINCIPAL); 
    String managerPassword = elt.getAttribute(ATT_PASSWORD); 

    if (StringUtils.hasText(managerDn)) { 
     if(!StringUtils.hasText(managerPassword)) { 
      parserContext.getReaderContext().error("You must specify the " + ATT_PASSWORD + 
        " if you supply a " + managerDn, elt); 
     } 

     contextSource.getPropertyValues().addPropertyValue("userDn", managerDn); 
     contextSource.getPropertyValues().addPropertyValue("password", managerPassword); 
    } 

    ... 
} 

अगर मैं यहाँ डिबग, सभी चर (यूआरएल, managerDn, managerPassword ...) संपत्ति फ़ाइल में निर्दिष्ट मान से बदल नहीं कर रहे हैं: यहाँ एक उद्धरण है। और इसलिए, यूआरएल का मूल्य $ {ldap.server.url} है, प्रबंधक डीएन का मूल्य $ {ldap.server.manager.dn} है और इसी तरह।

विधि पार्स एक बीन बनाता है, एक संदर्भ स्रोत जिसका आगे उपयोग किया जाएगा। और जब इस बीन का उपयोग किया जाएगा, जगह धारकों को प्रतिस्थापित किया जाएगा।

यहां, हमें बग मिला। पार्स विधि जांचें कि क्या यूआरएल खाली है या नहीं। समस्या यह है कि यूआरएल खाली नहीं है क्योंकि इसकी कीमत $ {ldap.server.url} है। तो, पार्स विधि एक दूरस्थ स्रोत के रूप में एक संदर्भ स्रोत बनाता है।

जब निर्मित स्रोत का उपयोग किया जाएगा, तो यह खाली मूल्य (जैसे संपत्ति फ़ाइल में निर्दिष्ट) द्वारा $ {ldap.server.url} को प्रतिस्थापित करेगा। और ....... बग!

मैं वास्तव में कैसे पल के लिए इस को हल करने के पता नहीं, लेकिन अब मैं क्यों यह कीड़े को समझने;)

+0

यह एक बग नहीं है। यदि आप एम्बेडेड सर्वर बनाने जा रहे हैं तो यूआरएल विशेषता का उपयोग नहीं किया जाना चाहिए। Http://static.springsource.org/spring-security/site/docs/3.1.x/reference/ldap.html#ldap-server – Ritesh

+0

जो मैं एक बग कहता हूं वह यह है कि एक खाली स्ट्रिंग रन का उपयोग करके और एक चर का उपयोग करना दौड़ नहीं है क्योंकि वसंत सुरक्षा जांचती है कि यूआरएल वैरिएबल को इसके मूल्य से बदलकर खाली नहीं है (जो खाली हो सकता है!)। यह एक खराब डिजाइन है। –

+1

उस स्थिति में, मुझे लगता है कि स्प्रिंग बग ट्रैकर में किसी समस्या की रिपोर्ट करना समझ में आता है, है ना? https://jira.springsource.org/secure/Dashboard.jspa –

1

मैं इसे व्याख्या नहीं कर सकते, लेकिन मुझे लगता है कि आप अपनी समस्या को ठीक कर सकते डिफ़ॉल्ट सिंटैक्स का उपयोग करके, स्प्रिंग 3.0.0.RC1 (see) के बाद उपलब्ध है।

में chageg लॉग इन करें आप पढ़ सकते हैं: PropertyPlaceholderConfigurer "$ {MyKey: myDefaultValue}" का समर्थन करता है दोषी वाक्य रचना

वैसे भी, मुझे लगता है कि समस्या है, क्योंकि "" मान्य मान है, लेकिन संपत्ति फ़ाइल में कोई मूल्य नहीं नहीं है।

+0

उत्तर के लिए धन्यवाद है, लेकिन मेरे पास डिफ़ॉल्ट मान युक्ति का उपयोग करके हमेशा एक ही बग है। –

+0

मुझे यह समझ में नहीं आता है। यदि डिफ़ॉल्ट मान है '' मुझे लगता है कि यह वही होना चाहिए जो इसे '' पर सेट कर रहा हो। – jddsantaella

+0

हां, मैं भी ऐसा सोच रहा था ... यह बहुत अजीब है ... शायद, यूआरएल का सेटटर केवल तभी बुलाया जाता है जब हम एक वसंत अभिव्यक्ति का उपयोग करते हैं, और सेटर को खाली मूल्य के साथ बुलाते हुए बग का कारण बनता है। अभिव्यक्ति निर्दिष्ट नहीं करने के मामले में, सेटटर शायद नहीं कहा जाता है? –

1

मुझे लगता है कि url="" काम करता है क्योंकि url विशेषता वसंत-सुरक्षा XSD में टाइप xs:token की है और रिक्त स्ट्रिंग null में बदल जाती है (xs:token उसके आगे या पीछे रिक्त स्थान को हटा रहा है, इसलिए "" कोई मूल्य नहीं के रूप में पहचाना जा सकता है)। शायद ${ldap.server.url} का मान खाली स्ट्रिंग के रूप में हल किया गया है और यही कारण है कि आपको एक त्रुटि मिली है।

आप LDAP सर्वर के विभिन्न विन्यास परिभाषित करने के लिए उपयोग स्प्रिंग प्रोफाइल कोशिश (प्रोफाइल के बारे में जानकारी के लिए Spring Team Blog देखें)

+1

LdapServerBeanDefinitionParser पहले से ही इसका ख्याल रख रहा है। किसी भी तरह से यह organor में रिक्त यूआरएल के साथ org.springframework.security.ldap.DefaultSpringSecurityContextSource की बीन परिभाषा बनाने में कामयाब रहा, भले ही सभी चेक इसे रोकने के लिए जगह पर हों। – Ritesh

+1

मुझे लगता है कि मैंने पाया है कि रितेश का अधिकार क्यों है और यह क्यों नहीं चलता है: जब मैं सर्वर के लॉन्च को डीबग करता हूं (LdapServerBeanDefinition के विधि पार्स में), सभी प्लेसहोल्डर्स को प्रतिस्थापित नहीं किया जाता है। तो यूआरएल है: $ {ldap.server.url}। संदर्भ धारक के निर्माण के बाद स्थान धारक का संकल्प किया जाता है। –

+0

दस्तावेज के अनुसार http://static.springsource.org/spring-security/site/docs/3.1.x/reference/ldap.html#ldap-server, यूआरएल विशेषता का उपयोग बिल्कुल नहीं किया जाना चाहिए यदि हम चाहते हैं एम्बेडेड सर्वर बनाएँ। – Ritesh

1

मेरा मानना ​​है कि यहाँ कोई समस्या है जगह धारकों का उपयोग करते समय कर सकते हैं। निम्नलिखित सबसे शायद समस्या का समाधान होगा:

विधि में एक वर्ग जो PropertyPlaceHolderConfigurer फैली बनाएँ और अपने विधि ओवरराइड convertPropertyValue() आप रिक्त स्ट्रिंग के रूप में संपत्ति लौट सकते हैं आप एक स्ट्रिंग प्रकार का है जो के अलावा और कुछ पाते हैं एलडीएपी यूआरएल यानी ldap: //myldapserver.com/dc=springframeworg,dc=org

इसके अलावा आपको संदर्भ फ़ाइल में प्रॉपर्टीप्लेसहोल्डर कॉन्फ़िगरर श्रेणी के अपने नए विशेषज्ञता को कॉन्फ़िगर करने की आवश्यकता है।

उम्मीद है कि इससे मदद मिलती है।

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