2013-03-01 11 views
10

Sto scrivendo una domanda qui perché non sono stato in grado di trovare la soluzione da solo per mesi. La mia situazione: ho un'applicazione client-server scritta su java che usa Java2ee 6 e EJB3.0. Il lato server è distribuito su glassfish 3.0. Devo sviluppare/implementare il modulo di login per l'applicazione. L'autenticazione deve essere effettuata utilizzando il server LDAP e l'autorizzazione verrà gestita all'interno dell'applicazione. Pertanto voglio assumere la tecnologia JAAS per miscelare l'autenticazione e l'autorizzazione. Lo sto facendo ad esempio come here. Quindi seguo this tutorial e official documentation per eseguire l'accesso. Il mio problema è che l'accesso a ldap non funziona.Configurazione JAAS e modulo di login LDAP in JavaEE 6

Il mio codice:

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

mio file di configurazione 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; 
}; 

La parte client di applicazione viene eseguita con le seguenti opzioni JVM:

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

Sul sito glassfish Ho impostato le proprietà jvm

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

Il file login.conf sul lato GlassFish contiene le seguenti righe (ADRealm è il regno di default del mio GlassFish)

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

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

che voglio sottolineare la tua attenzione che sto cercando di eseguire il login ldap almeno per essere sicuro che funzioni.

Quando eseguo il cliente ottengo il seguente errore: (!)

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

Quello che è strano è che ha funzionato una volta, vale a dire potrei ottenere subject da lc.getSubject() metodo. Inoltre assumo che handle() suddetto metodo non viene richiamato dal momento che non vedo

Login done. 
Password done. 

nell'output.

Per favore qualcuno può aiutarmi ???

+0

Prendete una buona occhiata a [questa risposta eccellente] (http://stackoverflow.com/questions/2206911/best-way-for-user-authentication-on-javaee-6-using-jsf-2-0/2207147#2207147) per ottenere la conoscenza dell'autenticazione JAAS. – skuntsel

+0

Vedere qui: http://docs.oracle.com/javase/6/docs/jre/api/security/jaas/spec/com/sun/security/auth/module/LdapLoginModule.html: "authIdentity = auth_id Questa opzione specifica l'identità da utilizzare quando si autentica un utente nella directory LDAP ... Si noti che se questa opzione non contiene un nome distinto, è necessario specificare anche l'opzione userFilter. " Hai provato ad aggiungere l'opzione userFilter? – Dikla

risposta

0

1 ° - Su LDAP non si utilizza un utente amministratore, ma crea un altro utente con criteri necessari per la ricerca e/o legare, se necessario. Un utente amministratore non è sicuro e non consigliato, specialmente in un contesto Java EE.

2nd - A che tipo di server LDAP si tenta di connettersi? OpenLDAP o un server Exchange?

Ti sto riferendosi a questi collegamenti, in attesa per la risposta:

+0

Grazie per la risposta, @Giorgio! Per quanto riguarda la tua seconda domanda, sto utilizzando Active Directory, una parte del server Win 2003 R2. Ho già letto quella documentazione, ma lo farò ancora una volta con attenzione. E dal modo in cui ho respinto l'idea di utilizzare gli strumenti JAAS, perché non avevo molto tempo. Invece ho usato 'InitialLdapContext' sul lato server. – Oleg

+0

Ciao, grazie per le informazioni. Con Active Directory W2003 R2, creare un utente associato al gruppo 'SchemaAdmin'. –

+0

Grazie, ha funzionato. – Oleg

Problemi correlati