मैंने वही चीज़ देखी है जो आप पूछ रहे हैं। अब तक, मुझे ऐसा करने के लिए जेडीके पर कोई रास्ता नहीं मिला है।
जावा बग डेटाबेस पर वृद्धि के लिए अनुरोध है। यह पता लगाने के लिए report पर एक नज़र डालें कि क्या उसे सूर्य से प्रतिक्रिया मिलती है (रिपोर्ट को वोट दें ताकि आशा है कि जल्द ही ठीक हो जाए)।
मैं क्या कर रहा था, sun.net.www.protocol.http.NTLMAuthentication
कक्षा ओवरराइड था। sun.net.www.protocol.http.HttpURLAuthentication
को देख कर, मैंने पाया कि केवल एक चीज आप संशोधित करने की जरूरत का परिणाम है:
NTLMAuthentication.supportsTransparentAuth()
विंडोज प्लेटफॉर्म पर
विधि एक हार्डकोडेड वापसी मूल्य होता है, true
और false
अन्यथा। इस कोड को एक JDK विंडोज 7 पर स्थापित से निकाला जाता है:
static boolean supportsTransparentAuth()
{
return true;
}
क्या उस विधि बताता है विंडोज साख डिफ़ॉल्ट रूप से इस्तेमाल किया जाना चाहिए है। यदि true
पर सेट किया गया है, आपके कस्टम प्रमाणीकरण कोड को नहीं कहा जाएगा। HttpURLConnection
वर्ग के इस टुकड़ा देखें:
//Declared as a member variable of HttpURLConnection
private boolean tryTransparentNTLMServer = NTLMAuthentication.supportsTransparentAuth();
//Inside of getServerAuthentication method.
PasswordAuthentication a = null;
if (!tryTransparentNTLMServer) {
//If set to false, this will call Authenticator.requestPasswordAuthentication().
a = privilegedRequestPasswordAuthentication(url.getHost(), addr, port, url.getProtocol(), "", scheme, url, RequestorType.SERVER);
}
/* If we are not trying transparent authentication then
* we need to have a PasswordAuthentication instance. For
* transparent authentication (Windows only) the username
* and password will be picked up from the current logged
* on users credentials.
*/
if (tryTransparentNTLMServer || (!tryTransparentNTLMServer && a != null)) {
//If set to true or if Authenticator did not return any credentials, use Windows credentials.
//NTLMAuthentication constructor, if receives a == null will fetch current looged user credentials.
ret = new NTLMAuthentication(false, url1, a);
}
NTLMAuthentication
स्रोत कोड प्राप्त करने के लिए, मैं this Java decompiler इस्तेमाल किया। जेडीके स्थापना फ़ोल्डर पर स्थित rt.jar खोला और वांछित कक्षा कोड की प्रतिलिपि बनाई।
फिर, मैंने झूठी वापसी के लिए supportsTransparentAuth
को बदल दिया। हालांकि, यह बहुत वांछनीय होगा यदि इस विधि ने पहले सिस्टम प्रॉपर्टी की जांच की और फिर उस पर आधारित सही या गलत लौटा दिया।
यह संकलन करने के लिए, मैं सिर्फ जावा फ़ाइल के नीचे धूप/नेट/www/प्रोटोकॉल/http फ़ोल्डर संरचना रखा जाता है और चलाएँ:
javac NTLMAuthentication.java
तब का उपयोग कर अपने आवेदन चलाएँ:
java -Xbootclasspath:"path/to/your/sun/net/www/protocol/http/classes;normal/JDK/boot/directories"
कि rt.jar में से पहले NTLMAuthentication
के हमारे कार्यान्वयन को लोड करने के लिए जेवीएम को बताएगा। -Xbootclasspath
के साथ किसी भी डिफ़ॉल्ट वर्ग लोडिंग पथ को याद न करने के लिए आपको सावधान रहना होगा, या ClassNotFound
त्रुटियां होंगी।
उसके बाद, सबकुछ ठीक काम करता था।
इस दृष्टिकोण में महत्वपूर्ण कमीएं हैं जिनके बारे में आपको अवगत होना चाहिए।
- सुरक्षा जोखिम हैं। कोई भी आपके बूट फ़ोल्डर पर एक अलग .class फ़ाइल छोड़ सकता है और उपयोगकर्ता प्रमाण-पत्र या अन्य महत्वपूर्ण जानकारी चुरा सकता है।
- सूर्य पैकेज से कोड बिना किसी सूचना के बदल सकते हैं और इस प्रकार आपके परिवर्तनों के साथ असंगत हो सकते हैं।
- यदि आप इस कोड को तैनात करते हैं, तो आप सूर्य कोड लाइसेंस का उल्लंघन करेंगे। documentation से:
-Xbootclasspath: bootclasspath निर्देशिका, जार अभिलेखागार के एक अर्धविराम द्वारा अलग किए सूची निर्दिष्ट करें, और बूट वर्ग फ़ाइलों के लिए खोज करने के लिए अभिलेखागार ज़िप। इन्हें जावा 2 एसडीके में शामिल बूट क्लास फ़ाइलों के स्थान पर उपयोग किया जाता है। नोट: के प्रयोजन के लिए इस विकल्प का उपयोग करने वाले अनुप्रयोगों को rt.jar में किसी वर्ग को ओवरराइड करने के लिए तैनात नहीं किया जाना चाहिए, इसलिए जावा 2 रनटाइम पर्यावरण बाइनरी कोड लाइसेंस का उल्लंघन करेगा।
तो, यह निश्चित रूप से उत्पादन वातावरण के लिए उपयुक्त नहीं है। PDF
आशा इस मदद करता है:
अंत में, इस बारे में बूट वर्ग पथ विकल्प और जावा वर्ग लोडर बहुत अच्छा स्रोत है।
आप कोड को पा सकते हैं जो 'sun.net.www.protocol.http.HttpURLConnection' क्लास पर Windows Credentials का उपयोग करते हुए मान्य करता है। 'NTLMAuthentication' उदाहरणों और ध्वज 'tryTransparentNTLMServer' के निर्माण पर एक नज़र डालें।मैं आपके जैसा ही काम करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि यह कैसे करना है। – jmend