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 ???
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
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