2013-03-01 28 views
10

Piszę pytanie tutaj, bo nie udało się znaleźć rozwiązanie się przez kilka miesięcy. Moja sytuacja: Mam aplikację klient-serwer napisaną na java, która używa Java2ee 6 i EJB3.0. Strona serwera jest wdrożona na glassfish 3.0. Muszę opracować/wdrożyć moduł logowania do aplikacji. Uwierzytelnienie musi zostać wykonane przy użyciu serwera LDAP, a autoryzacja będzie obsługiwana w aplikacji. Dlatego chcę wynająć technologię JAAS do mieszania uwierzytelniania i autoryzacji. Robię to na przykład jak here. Potem wykonaj this tutorial i official documentation wykonać logowanie. Mój problem polega na tym, że logowanie ldap nie działa.JAAS konfiguracja i LDAP moduł logowania w JavaEE 6

Mój kod:

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(); 
    } 

Mój plik konfiguracyjny 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; 
}; 

Część klient aplikacja jest uruchamiana z następujących JVM opcji:

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

Na GlassFish miejscu I ustawić właściwości JVM

-Djava.security.auth.login.config=${com.sun.aas.instanceRoot}/config/login.conf 
-Djava.naming.referral=follow 

Plik login.conf na GlassFish stronie zawiera następujące wiersze (ADRealm jest domyślnym sfera mojego GlassFish)

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

Ustawienia ADRealm:

 <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]" /> 

Chcę stresu twoja uwaga, że ​​próbuję wykonać login ldap przynajmniej żeby się upewnić, że to działa.

Kiedy uruchomić klienta pojawia się następujący błąd: (!)

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

Co jest dziwne, że przerabia raz, to mogę uzyskać subject z lc.getSubject() metody. Również zakładam, że handle() powyżej metoda nie jest wywoływany, ponieważ nie widzę

Login done. 
Password done. 

na wyjściu.

Proszę może ktoś mi pomóc ???

+0

Przyjrzyj się dobrze w tej doskonałej [odpowiedzi] (http://stackoverflow.com/questions/2206911/best-way-for-user-authentication-on-javaee-6-using-jsf-2-0/2207147#2207147), aby uzyskać informacje na temat uwierzytelniania JAAS. – skuntsel

+0

Zobacz tutaj: http://docs.oracle.com/javase/6/docs/jre/api/security/jaas/spec/com/sun/security/auth/module/LdapLoginModule.html: "authIdentity = auth_id Ta opcja określa tożsamość, która ma być używana podczas uwierzytelniania użytkownika w katalogu LDAP ... Uwaga: jeśli ta opcja nie zawiera nazwy wyróżniającej, należy również podać opcję userFilter. " Czy próbowałeś dodać opcję userFilter? – Dikla

Odpowiedz

0

1-ty - Na LDAP nie używać użytkownika admin, ale utworzyć kolejną użytkownikowi niezbędne kryteria wyszukiwania i/lub wiązać w razie potrzeby. Użytkownik admin nie jest bezpieczny i nie jest zalecany, szczególnie w kontekście Java EE.

2-ty - Jaki serwer LDAP starasz się połączyć? OpenLDAP lub serwer Exchange?

mam na myśli do tych linków, czekając na odpowiedź:

+0

Dziękuję za odpowiedź, @Giorgio! Jeśli chodzi o twoje drugie pytanie, używam Active Directory, części Win Server 2003 R2. Przeczytałem już tę dokumentację, ale zrobię to jeszcze raz ostrożnie. A tak przy okazji, odrzuciłem pomysł użycia narzędzi JAAS, ponieważ nie miałem zbyt wiele czasu. Zamiast tego użyłem 'InitialLdapContext' po stronie serwera. – Oleg

+0

Cześć, dziękuję za informacje. W usłudze Active Directory W2003 R2 utwórz użytkownika powiązanego z grupą "SchemaAdmin". –

+0

Dzięki, to zadziałało. – Oleg