Je suis d'accord avec fanf42, j'ai juste envie de s'étendre sur sa réponse. Si vous êtes à l'aide de Printemps de votre choix est facile. Pour le reste d'entre nous, l'API d'Apache n'est pas encore arrivé à maturité et la plupart des autres semblent être laissés à l'abandon, laissant JNDI et UnboundID de l'API LDAP.
Des deux, UnboundID de l'API est beaucoup plus facile à utiliser. Voici un exemple simple de vérifier les références d'un utilisateur:
avec JNDI:
static boolean authenticate(String username, String password) {
try {
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
props.put(Context.PROVIDER_URL, "ldap://ldap.example.com");
props.put(Context.REFERRAL, "ignore");
props.put(Context.SECURITY_PRINCIPAL, dnFromUser(username));
props.put(Context.SECURITY_CREDENTIALS, password);
InitialDirContext context = new InitialDirContext(props);
return true;
}
catch (NamingException e) {
return false;
}
}
private static String dnFromUser(String username) throws NamingException {
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
props.put(Context.PROVIDER_URL, "ldap://ldap.example.com");
props.put(Context.REFERRAL, "ignore");
InitialDirContext context = new InitialDirContext(props);
SearchControls ctrls = new SearchControls();
ctrls.setReturningAttributes(new String[] { "givenName", "sn" });
ctrls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration<SearchResult> answers = context.search("dc=People,dc=example,dc=com", "(uid=" + username + ")", ctrls);
SearchResult result = answers.next();
return result.getNameInNamespace();
}
avec UnboundID:
static boolean authenticate(String username, String password) throws LDAPException {
LDAPConnection ldap = new LDAPConnection("ldap.example.com", 389);
SearchResult sr = ldap.search("dc=People,dc=example,dc=com", SearchScope.SUB, "(uid=" + username + ")");
if (sr.getEntryCount() == 0)
return false;
String dn = sr.getSearchEntries().get(0).getDN();
try {
ldap = new LDAPConnection("ldap.example.com", 389, dn, password);
return true;
}
catch (LDAPException e) {
if (e.getResultCode() == ResultCode.INVALID_CREDENTIALS)
return false;
throw e;
}
}
En plus d'être beaucoup plus courte, de nommage est plus intuitive et il n'y a pas d'obscurs objets intermédiaires pour créer.