Besoin :
- Connexion à un LDAP en SSL
- Ajouter des groupes ( organizationalUnit et group )
- Ajout des users
- Changer son mot de passe
- Ajouter l'utilisateur à un groupe
- Le tout en java
Donc pour cela j'ai utilisé la bibliothèque déjà inclue dans java :
Classe permettant d’interagir avec l'annuaire
package tools;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NameAlreadyBoundException;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.AttributeInUseException;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.ModificationItem;
public class LdapTool {
private DirContext context;
/**
* Connexion au LDAP
* @param url
* @param port
* @param base
* @param password
* @throws NamingException
*/
public void connect(String url, int port, String base, String password)
throws NamingException {
Hashtable<String, Object> env = new Hashtable<String, Object>(11);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
// Bien spécifier le port non SSL
env.put(Context.PROVIDER_URL, url + ":" + port);
// Authentification en mode simple
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, base);
env.put(Context.SECURITY_CREDENTIALS, password);
env.put(Context.SECURITY_PROTOCOL, "ssl");
context = new InitialDirContext(env);
}
/**
* Permet de créer un groupe organizationalperson (OU)
*/
public void createUser(String distinguishedName) throws NamingException {
//Création des attributs à injecter
Attributes newAttributes = new BasicAttributes(true);
Attribute oc = new BasicAttribute("objectclass");
oc.add("top");
oc.add("person");
oc.add("organizationalperson");
oc.add("user");
newAttributes.put(oc);
// newAttributes.put(new BasicAttribute("memberOf",
// "CN=Gestionnaire sinistre,OU=GROUPES,OU=ENTITE_GAM,DC=RACONIT2" ));
context.createSubcontext("CN=" + distinguishedName, newAttributes);
}
/**
* Permet de modifier un attribut
* Si on ajouter un utilisateur à groupe, il suffit de modifier l'attribut member
*
* @throws NamingException
*/
public void modifyAttributes(String distinguishedName, String attribut,
String valeur) throws NamingException,AttributeInUseException {
BasicAttribute att = new BasicAttribute(attribut);
att.add(valeur);
ModificationItem[] mod = new ModificationItem[1];
mod[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, att);
context.modifyAttributes(distinguishedName, mod);
}
/**
* Permet de créer un groupe de type group (CN)
*/
public void createGroup(String distinguishedName, String classGroup,
String description) throws NamingException,
NameAlreadyBoundException {
Attributes newAttributes = new BasicAttributes(true);
Attribute oc = new BasicAttribute("objectclass");
oc.add("top");
oc.add(classGroup);
if (classGroup.equals("group")) {
}
if (!description.equals("")) {
newAttributes.put(new BasicAttribute("description", description));
}
// Rajouter ici les parametres supplémetaires
// newAttributes.put(new BasicAttribute("displayName", "test" ));*/
newAttributes.put(oc);
context.createSubcontext(distinguishedName, newAttributes);
}
/**
* Permet de modifier le passord
*
* @throws NamingException
*/
public void updatePassword(String distinguishedName, String password)
throws NamingException {
ModificationItem[] mods = new ModificationItem[1];
mods[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE,
new BasicAttribute("userPassword", password));
context.modifyAttributes("CN=" + distinguishedName, mods);
}
/**
*
* @param distinguishedName
* @throws NamingException
*/
public void activateUser(String distinguishedName) throws NamingException {
ModificationItem[] mods = new ModificationItem[1];
mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,
new BasicAttribute("msDS-UserAccountDisabled", "FALSE"));
context.modifyAttributes("CN=" + distinguishedName, mods);
}
/**
* Permet de créer un utilisateur, de changer son mot de passe et d'activer son compte )
* @param distinguishedName
* @param password
* @throws NamingException
*/
public void createUserPasswordActivate(String distinguishedName, String password)
throws NamingException {
//Création du compte
createUser(distinguishedName);
//Assignation du mot de passe
updatePassword(distinguishedName, password);
//Activation du compte
activateUser(distinguishedName);
}
}
Classe de test :
String url = myProp.getProperty("monLDAP.fr");
int port = Integer.valueOf(myProp.getProperty("651"));
String base = myProp.getProperty("CN=TOTO,OU=UTILISATEURS,DC=DCBASE");
String password = myProp.getProperty("monPassword");
//Import du KeyStore - Nécessaire pour la connexion LDAP
String keystore = myProp.getProperty("keyStore.path");
System.setProperty("javax.net.ssl.trustStore", keystore);
System.setProperty("javax.net.ssl.keyStorePassword", myProp.getProperty("keyStore.key"));
//Connexion au LDAP
mLdap.connect(url, port, base, password);
//Création d'un groupe
mLdap.createGroup("OU=Groupe1,DC=DCBASE,"oganizationalUnit", "Description du groupe");
mLdap.createGroup("CN=Groupe11,OU=Groupe1,DC=DCBASE,"group", "Description du groupe");
mLdap.createUserPasswordActivate("CN=monUser,CN=Groupe11,OU=Groupe1,DC=DCBASE","toto");
//Ajout de l'utilisateur au groupe
mLdap.modifyAttributes("CN=Groupe11,OU=Groupe1,DC=DCBASE "member", "CN=monUser,CN=Groupe11,OU=Groupe1,DC=DCBASE");