2013-03-01 7 views
10

मैं यहां एक प्रश्न लिख रहा हूं क्योंकि मैं महीनों के लिए स्वयं समाधान नहीं ढूंढ पाया। मेरी स्थिति: मेरे पास जावा पर लिखे गए क्लाइंट-सर्वर एप्लिकेशन हैं जो Java2ee 6 और EJB3.0 का उपयोग करते हैं। सर्वर पक्ष ग्लासफ़िश 3.0 पर तैनात किया गया है। मुझे आवेदन के लिए लॉगिन मॉड्यूल को विकसित/कार्यान्वित करने की आवश्यकता है। प्रमाणीकरण ldap सर्वर का उपयोग करके किया जाना चाहिए और प्रमाणीकरण आवेदन के अंदर संभाला जाएगा। इसलिए मैं प्रमाणीकरण और प्रमाणीकरण मिश्रण करने के लिए जेएएएस प्रौद्योगिकी को किराए पर लेना चाहता हूं। मैं इसे उदाहरण के लिए कर रहा हूं जैसे here। फिर मैं लॉगिन करने के लिए this tutorial और official documentation का पालन करता हूं। मेरी समस्या यह है कि ldap लॉगिन काम नहीं करता है।जावाईई में जेएएएस कॉन्फ़िगरेशन और एलडीएपी लॉगिन मॉड्यूल 6

मेरे कोड:

LoginContext lc = null; 

    try { 
     CallbackHandler handler = new CallbackHandler() { 
      public void handle(Callback[] callbacks) throws UnsupportedCallbackException { 
       for(int i = 0; i < callbacks.length; i++) { 
        if(callbacks[i] instanceof NameCallback) { 
         // prompt the user for a username 
          NameCallback nc = (NameCallback)callbacks[i]; 
          nc.setName("admin"); 
          System.out.println("Login done."); 
        } else if(callbacks[i] instanceof PasswordCallback) { 
         // prompt the user for sensitive information 
          PasswordCallback pc = (PasswordCallback)callbacks[i]; 
          pc.setPassword("mypassword".toCharArray()); 
          System.out.println("Password done."); 
        } else { 
         throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback"); 
        } //end if/else 
       } //end for() 
      } 
     }; 

     lc = new LoginContext("myAuth", handler); 
     lc.login(); 
     Subject subject = lc.getSubject(); 
    } catch (LoginException e) { 
     e.printStackTrace(); 
    } 

मेरे JAAS विन्यास फाइल:

myAuth { 
com.sun.enterprise.security.auth.login.LDAPLoginModule REQUIRED 
userProvider="ldap://mydomain:389/OU=users,DC=my,DC=domain,DC=com" 
authIdentity="{USERNAME}" 
    useSSL=false 
debug=true; 
}; 

आवेदन की ग्राहक भाग निम्नलिखित JVM विकल्पों के साथ चलाया जाता है:

-Djava.security.auth.login.config=./jaas.conf -Dorg.omg.CORBA.ORBInitialHost=localhost 

glassfish साइट पर मैंने जेवीएम गुण

सेट किया
-Djava.security.auth.login.config=${com.sun.aas.instanceRoot}/config/login.conf 
-Djava.naming.referral=follow 

glassfish तरफ login.conf फ़ाइल निम्न रेखाएं हों, ADRealm के लिए

ADRealm { 
com.sun.enterprise.security.auth.login.LDAPLoginModule REQUIRED; 
}; 

सेटिंग्स (ADRealm मेरी glassfish के डिफ़ॉल्ट दायरे है):

 <property name="jaas-context" value="ldapRealm" /> 
     <property name="base-dn" value="CN=users,DC=my,DC=domain,DC=com" /> 
     <property name="directory" value="ldap://mydomain:3268" /> 
     <property name="search-bind-password" value="mypassword" /> 
     <property name="search-bind-dn" value="[email protected]" /> 

मैं तनाव करना चाहते हैं आपका ध्यान है कि मैं कम से कम यह सुनिश्चित करने के लिए ldap लॉगिन करने की कोशिश कर रहा हूं कि यह काम करता है।

जब मैं ग्राहक मैं निम्नलिखित त्रुटि मिलती है चलाएँ: (!)

Mar 1, 2013 1:36:44 PM com.sun.appserv.security.AppservPasswordLoginModule extractCredentials 
SEVERE: passwordlm.nopwdcred 
javax.security.auth.login.LoginException: No credentials. 

क्या अजीब बात है कि एक बार काम किया है, यानि कि मैं subjectlc.getSubject() विधि से प्राप्त कर सकते हैं। इसके अलावा मुझे लगता है कि handle() विधि ऊपर लागू नहीं किया गया है के बाद से मैं उत्पादन में

Login done. 
Password done. 

नहीं दिख रहा।

कृपया कोई मेरी मदद कर सकता है ???

+0

[इस उत्कृष्ट जवाब] पर एक अच्छा नजर डालें (जेएएएस प्रमाणीकरण को समझने के लिए http://stackoverflow.com/questions/2206911/best-way-for-user- प्रमाणीकरण-on-javaee-6-using-jsf-2-0/2207147#2207147)। – skuntsel

+0

यहां देखें: http://docs.oracle.com/javase/6/docs/jre/api/security/jaas/spec/com/sun/security/auth/module/LdapLoginModule.html: "authIdentity = auth_id यह विकल्प एलडीएपी निर्देशिका में उपयोगकर्ता को प्रमाणीकृत करते समय उपयोग करने के लिए पहचान निर्दिष्ट करता है ... ध्यान दें कि यदि इस विकल्प में एक विशिष्ट नाम नहीं है तो उपयोगकर्ताफिल्टर विकल्प भी निर्दिष्ट किया जाना चाहिए। " क्या आपने उपयोगकर्ताफिल्टर विकल्प जोड़ने का प्रयास किया था? – Dikla

उत्तर

0

पहला - एलडीएपी पर आप एक व्यवस्थापक उपयोगकर्ता का उपयोग नहीं करते हैं, लेकिन यदि आवश्यक हो तो खोज और/या बाध्य करने के लिए आवश्यक मानदंड के साथ एक और उपयोगकर्ता बनाएं। एक व्यवस्थापक उपयोगकर्ता सुरक्षित नहीं है और विशेष रूप से जावा ईई संदर्भ में अनुशंसित नहीं है।

दूसरा - आप किस प्रकार का एलडीएपी सर्वर कनेक्ट करने का प्रयास करते हैं? ओपनएलडीएपी या एक्सचेंज सर्वर?

मैं, इन कड़ियों के लिए आप बात कर रहा हूँ, जबकि आपकी प्रतिक्रिया की प्रतीक्षा:

+0

उत्तर के लिए धन्यवाद, @ जॉर्जियो! आपके दूसरे प्रश्न के संबंध में मैं सक्रिय निर्देशिका का उपयोग कर रहा हूं, विन सर्वर 2003 R2 का एक हिस्सा। मैंने पहले से ही उस दस्तावेज़ीकरण को पढ़ लिया है लेकिन मैं इसे एक बार सावधानी से करूँगा। और जिस तरह से मैंने जेएएएस उपकरण का उपयोग करने के विचार को खारिज कर दिया, क्योंकि मेरे पास अधिक समय नहीं था। इसके बजाय मैंने सर्वर की ओर 'InitialLdapContext' को नियोजित किया। – Oleg

+0

हाय, सूचनाओं के लिए धन्यवाद। सक्रिय निर्देशिका W2003 R2 के साथ, 'SchemaAdmin' समूह द्वारा संबद्ध उपयोगकर्ता बनाएं। –

+0

धन्यवाद, यह काम किया। – Oleg

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