mardi 20 décembre 2011

[JAVA] Connexion LDAP en java

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");






Aucun commentaire:

Enregistrer un commentaire