Devo eseguire l'autenticazione LDAP per un'applicazione.Autenticazione LDAP con Java
ho provato il seguente programma:
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
public class LdapContextCreation {
public static void main(String[] args) {
LdapContextCreation ldapContxCrtn = new LdapContextCreation();
LdapContext ctx = ldapContxCrtn.getLdapContext();
}
public LdapContext getLdapContext(){
LdapContext ctx = null;
try{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_AUTHENTICATION, "Simple");
//it can be <domain\\userid> something that you use for windows login
//it can also be
env.put(Context.SECURITY_PRINCIPAL, "[email protected]");
env.put(Context.SECURITY_CREDENTIALS, "password");
//in following property we specify ldap protocol and connection url.
//generally the port is 389
env.put(Context.PROVIDER_URL, "ldap://server.domain.com");
ctx = new InitialLdapContext(env, null);
System.out.println("Connection Successful.");
}catch(NamingException nex){
System.out.println("LDAP Connection: FAILED");
nex.printStackTrace();
}
return ctx;
}
}
Ottenere seguente eccezione:
LDAP Connection: FAILED javax.naming.AuthenticationException: [LDAP: error code 49 - Invalid Credentials] at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3053) at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2999) at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2801) at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2715) at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:305) at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:187) at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:205) at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:148) at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:78) at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:235) at javax.naming.InitialContext.initializeDefaultInitCtx(InitialContext.java:318) at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:348) at javax.naming.InitialContext.internalInit(InitialContext.java:286) at javax.naming.InitialContext.init(InitialContext.java:308) at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:99) at LdapContextCreation.getLdapContext(LdapContextCreation.java:27) at LdapContextCreation.main(LdapContextCreation.java:12)
qualche punto in più da considerare:
All'inizio usavo
tomcat 5.3.5
ma qualcuno mi ha detto che solo Tomcat 6 sup lo porto così ho scaricatotomcat 6.0.35
e attualmente utilizzo solo questa versione.Configurato
server.xml
e ha aggiunto il seguente codice -
<Realm className="org.apache.catalina.realm.JNDIRealm" debug="99" connectionURL="ldap://server.domain.com:389/"
userPattern="{0}" />
commentato il seguente codice da
server.xml
-<!-- Commenting for LDAP <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> -->
Passi 2 e 3 da article
Qualcuno ha suggerito che ci sono alcuni file jar che si suppone essere copiati tomcat al fine di eseguire l'autenticazione
ldap
, è che qualcosa che devo fare? E quali filejar
?Inoltre, sto utilizzando le credenziali corrette di sicuro, quindi che cosa sta causando questo problema?
C'è un modo per determinare gli attributi corretti per LDAP nel caso in cui io stia utilizzando quelli errati?
Non ci sono librerie migliori di questo, ma qui è una domanda simile http://stackoverflow.com/a/12165647/1286621 Sono d'accordo con @jasim circa il principale. È necessario capire il formato utilizzato dal server LDAP. Ecco un esempio del mio server Active Directory "CN = bindUserName, CN = Users, DC = myDepartment, DC = myNetwork". Le persone LDAP dovrebbero essere abbastanza in grado di dirti quale sia il formato. Ci sono anche strumenti gui là fuori che possono connettersi a LDAP e sfogliare le directory. Parla prima con i tuoi amministratori. – Mike
Solo un altro commento, sei consapevole del fatto che di solito c'è un utente/password "Bind", uno che ha il permesso di cercare le informazioni nel server LDAP corretto? Una volta eseguito il binding al server, è possibile autenticare le credenziali dell'utente. – Mike