Je suis actuellement en train d'implémenter/configurer l'authentification LDAP d'une application web Java en utilisant Spring Security 3.0. J'utilise Microsoft AD LDS en tant que serveur LDAP et j'ai choisi le BindAuthenticator du Spring. J'ai découvert que l'authentification ne fonctionne que si l'utilisateur authentifié est membre du rôle Readers de la partition. Le BindAuthenticator essaie de lire les attributs de l'utilisateur après l'authentification, ce qui semble raisonnable dans les scénarios où les autorités sont extraites du service d'annuaire. Étant nouveau pour LDAP et AD, est-ce une pratique acceptable lorsque l'application est intégrée dans une structure AD existante? Peut-on affiner un dn donne à l'utilisateur dns seulement lire les permissions pour leurs propres attributs plutôt que de les ajouter au groupe de lecteurs?Pourquoi BindAuthenticator de Spring Security a-t-il besoin d'autorisations de lecture pour les utilisateurs?
Merci Thomas
Modifier 3/8/2010: Voici ce que je fini par faire: j'ai copié BindAuthenticator de printemps (la classe entière) et a changé la méthode bindWithDn() comme ci-dessous. Les différences sont marquées avec DIFF.
private DirContextOperations bindWithDn(String userDn, String username, String password) {
BaseLdapPathContextSource ctxSource = (BaseLdapPathContextSource) getContextSource();
DistinguishedName fullDn = new DistinguishedName(userDn);
fullDn.prepend(ctxSource.getBaseLdapPath());
logger.debug("Attempting to bind as " + fullDn);
DirContext ctx = null;
try {
ctx = getContextSource().getContext(fullDn.toString(), password);
// Check for password policy control
PasswordPolicyControl ppolicy = PasswordPolicyControlExtractor.extractControl(ctx);
// *DIFF* Attributes attrs = ctx.getAttributes(userDn, getUserAttributes());
DirContextAdapter result = new DirContextAdapter(null, new DistinguishedName(userDn), // *DIFF*
ctxSource.getBaseLdapPath());
if (ppolicy != null) {
result.setAttributeValue(ppolicy.getID(), ppolicy);
}
return result;
} catch (NamingException e) {
// This will be thrown if an invalid user name is used and the method may
// be called multiple times to try different names, so we trap the exception
// unless a subclass wishes to implement more specialized behaviour.
if ((e instanceof org.springframework.ldap.AuthenticationException)
|| (e instanceof org.springframework.ldap.OperationNotSupportedException)) {
handleBindException(userDn, username, e);
} else {
throw e;
}
// *DIFF* } catch (javax.naming.NamingException e) {
// *DIFF* throw LdapUtils.convertLdapException(e);
} finally {
LdapUtils.closeContext(ctx);
}
return null;
}
La solution que j'ai choisie - a pratiquement dupliqué le BindAuthenticator de Spring Security et a supprimé les lignes qui lisent les attributs de l'utilisateur. J'utilise un AuthoritiesPopulator personnalisé donc pas de problème là-bas. – Thomas