Grouper:Test LDAPPC

Un article de Wiki ESCO-Portail.

Sommaire

Test de LDAPPC

Références :


Configuration de LDAP

  • Ajouter le schéma conf/ldappc.schema au LDAP.
  • La définition des index suit les recommandations de la documentation LDAPPC :
index   objectClass           eq
index   uid                   pres,eq
index   cn                    pres,eq,sub
index   sn                    pres,eq,sub
index   hasMember             eq
index   member                eq
index   isMemberOf            eq

Configuration de LDAPPC

Fichier d'exemple (décrit les différentes options) : conf/ldappcTemplate.xml.
Fichier de configuration : conf/ldappc.xml.

<?xml version="1.0" encoding="utf-8"?>
 
<!-- 
    * This file contains data for testing Ldappc.
    *
    * See ldappcTemplate.xml for documentation regarding how to use these
    * elements.
-->
 
<ldappc>
  <grouper>
    <group-queries>
 
      <!-- Racine des groupes a exporter dans le ldap. -->  
      <subordinate-stem-queries>
        <stem-list>
          <stem>ESCO</stem>
        </stem-list>
      </subordinate-stem-queries>
    </group-queries>
    <groups structure="flat"
      root-dn="ou=groups,dc=esco-centre,dc=fr"
      ldap-object-class="groupOfNames"
      ldap-rdn-attribute="cn" grouper-attribute="name" >
      <group-members-dn-list list-object-class="groupOfNames" list-attribute="member" list-empty-value=""/>
 
      <group-members-name-list list-object-class="eduMember" list-attribute="hasMember" >
        <source-subject-name-mapping>
          <source-subject-name-map source="esco:ldap" subject-attribute="uid" />
         </source-subject-name-mapping>
      </group-members-name-list>
    </groups>
    <memberships>
      <member-groups-list 
        list-object-class="eduMember" 
        list-attribute="isMemberOf"
        naming-attribute="name" />
    </memberships>
  </grouper>
 
 
  <source-subject-identifiers>
    <source-subject-identifier source="esco:ldap" subject-attribute="uid" >
      <ldap-search base="ou=people,dc=esco-centre,dc=fr" 
        scope="subtree_scope" 
        filter="(uid={0})" />
    </source-subject-identifier>
  </source-subject-identifiers>
 
  <ldap>
    <context>
      <parameter-list>
        <parameter name="initial_context_factory" value="com.sun.jndi.ldap.LdapCtxFactory" />
        <parameter name="provider_url" value="ldap://<hostname>:389" />
        <parameter name="security_authentication" value="simple" />
        <parameter name="security_principal" value="cn=<user>,dc=esco-centre,dc=fr" />
        <parameter name="security_credentials" value="<password>" />
      </parameter-list>
    </context>
  </ldap>
 
</ldappc
  • Configuration de l'entrée grouper :
    • group-query : la requête concernant les groupes porte sur l'espace de noms racine : esco.
    • groups : conservation de la structure arborescente.
    • source-subject-name-mapping : configuration de la source de données (id, nom) idem à celle utilisée pour grouper (Subject API).
  • Entrée Signet : désactivé.
  • Entrée Subject : source-subject-identifiers : idem à celle utilisée pour Grouper (Subject API).

Exécution via Eclipse

Le jar pour la connexion à la base de données ainsi que les fichiers de conf de grouper doivent être dans le classpath :

  • grouper.properties,
  • grouper.hibernate.properties et
  • sources.xml.

Seule la cible ant install est utilisée, les tests unitaires ne sont pas exécutés.

LDAPPC est invoqué via Eclipse avec les paramètres suivants :

  • Classe : edu.internet2.middleware.ldappc.Ldappc
  • Arguments du programme : -subject GrouperSystem -memberships -groups

Résultats

Soit le groupe suivant définit dans grouper :

Image:LDAPPC_Groupe_Test.png



Au niveau de LDAP, la structure de groupe obtenue, avec conservation de l'arborescence est la suivante :
Image:LDAPPC_Groupe_Tree.png

Sans conservation de l'arborescence :
Image:LDAPPC_Groupe_Flat.png

La liste des groupes auxquels appartient une personne est stockée dans l'attribut isMemberOf :

dn: uid=Akd09200, ou=people, dc=esco-centre,dc=fr
(...)
uid: Akd09200
objectClass: ENTEleve
objectClass: eduMember
isMemberOf: esco:ENT_Groupes:etb2:GT1

Invocation en tache de fond

LDAPPC peut être invoqué dans une boucle via le paramètre -interval.

Exemples de scripts :

#! /bin/bash
# -------------------------------------#
# Variables de configuration           
# -------------------------------------#
LDAPPC_USER=grouper
LDAPPC_HOME=/opt/ldappc
SUBJECT=GrouperSystem
INTERVAL=500
MEMORY=256m
GROUPER_API_HOME=/opt/grouper-esco/grouper-api-1.2.1/
# -------------------------------------#
 
#--- Verification de l utilisateur.
check_user="false"
echo "USER=$USER"
if [ ! "$USER" =  "$LDAPPC_USER" -a "$check_user" = "true" ]
then
        echo -ne "\n\n!!! Attention !!!\n"
        echo "Le script /etc/init.d/ldappcctl devrait etre utilise pour lancer ldappc."
        echo -ne "Termine.\n\n"
        exit
fi
 
CMD_LINE="-subject $SUBJECT -memberships -groups -interval $INTERVAL"
 
 
cd $LDAPPC_HOME
 
if [ $? -ne 0 ]
then
   echo "Erreur: impossible d'aller dans $LDAPPC_HOME"
   exit 1
fi
 
# Construction du classpath
CP=./conf
if [ -z "$GROUPER_API_HOME" ]
then
    echo "Error: GROUPER_API_HOME is not set."
    exit 1
elif [ ! -d $GROUPER_API_HOME ]
then
    echo "Error: $GROUPER_API_HOME non trouve."
    exit 1
else
    if [ ! -r "$GROUPER_API_HOME/conf/sources.xml" ]
    then
        echo "Erreur: Impossible de trouver le fichier $GROUPER_API_HOME/conf/sources.xml."
        exit 1
    fi
 
    if [ ! -r "$GROUPER_API_HOME/conf/grouper.hibernate.properties" ]
    then
        echo "Erreur: Impossible de trouver le fichier $GROUPER_API_HOME/conf/grouper.hibernate.properties."
        exit 1
    fi
 
 
    CP=$CP:"$GROUPER_API_HOME/conf"
fi
 
for f in ./lib/*.jar
do 
    CP=${CP}:${f}; 
done
 
 
exec java -classpath ${CP} -Xmx$MEMORY  edu.internet2.middleware.ldappc.Ldappc $CMD_LINE

Script pour l invocation en mode démon (à placer dans /etc/init.d) :

#! /bin/bash
 
 
LDAPPC_USER=ardem
RESTART_DELAY=10
CONF_FILE="/etc/default/ldappc1.1.x"
LDAPPC_HOME=/opt/ldappc
 
PIDFILE=/var/run/ldappc.pid
 
# ---------------------------------------------- #
# Verification des variables d environnement     #
# ---------------------------------------------- #
if [ -z "$JAVA_HOME" ]
then
    echo "Erreur : variable JAVA_HOME non definie."
    exit 1
fi
LDAPPC_SCRIPT=$LDAPPC_HOME/scripts/runLdappc
if [ -z "$LDAPPC_HOME" ]
then
    echo "Erreur : variable LDAPPC_HOME non definie."
    exit 1
elif [ ! -x $LDAPPC_SCRIPT ]
then
    echo "Erreur script $LDAPPC_SCRIPT non trouve ou non executable."
    exit 1
fi
 
# Fonctionnement IDEM Apache.
NO_START=0
test -f $CONF_FILE && . $CONF_FILE
if [ "$NO_START" != "0" -a "$1" != "stop" ]; then 
    echo "Ne demarre pas ldappc - editer $CONF_FILE et changer NO_START a 0.";
    exit 0;
fi
 
# Verification de l utilisateur
if [ -z "`cat /etc/passwd | grep $LDAPPC_USER`" ]
then
    echo "Utilisateur $LCAPPC_USER non valide."
    exit 1
fi
 
 
case "$1" in
 
        start)
           if [ -f $PIDFILE ]
           then
               echo "Le fichier $PIDFILE existe deja. Essayer `basename $0` --stop  ou supprimer le fichier."
               exit 1
           fi
           echo -ne "\nStarting LDAPPC.\n\n"
           start-stop-daemon --start --quiet --pidfile $PIDFILE  --background --make-pidfile --chuid $LDAPPC_USER --exec $LDAPPC_SCRIPT 
 
        ;;
 
        stop)
         if [ ! -f $PIDFILE ]
         then
             echo "Fichier $PIDFILE non trouve, le programme $LDAPPC_SCRIPT ne semble pas actif."
             exit 1
         fi
           echo -ne "\nStopping LDAPPC.\n\n"
           start-stop-daemon --stop --quiet --pidfile $PIDFILE 
           rm $PIDFILE
        ;;
 
        restart)
           echo -ne "\nStopping LDAPPC.\n\n"
           start-stop-daemon --stop --quiet --pidfile $PIDFILE 
           sleep $RESTART_DELAY
           echo -ne "\nStarting LDAPPC.\n\n"
           start-stop-daemon --start --quiet --pidfile $PIDFILE  --background --make-pidfile --chuid $LDAPPC_USER --exec $LDAPPC_SCRIPT 
 
        ;;
 
        *)
           echo "Usage: $0 {start|stop|restart}"
        ;;
esac

Remarque le script suivant lis le fichier /etc/default/ldappc1.1.x, pour déterminer s'il doit être lancé au démarrage.

NO_START=0

Problèmes / Solutions

  • Failed to find GrouperSession: cannot realize interface edu.internet2.middleware.grouper.internal.cache.SimpleSubjectCache: edu.internet2.middleware.grouper.internal.cache.SimpleSubjectCache
=> Mettre à jour le jar pour l'API de Grouper.
  • java.lang.IllegalStateException: null dto in class edu.internet2.middleware.grouper.GrouperSession
=> Dans la méthode GrouperSessionControl.stopSession() (package edu.internet2.middleware.ldappc) remplacer :
    session.stop();
    DebugLog.info("Stopped GrouperSession: " + session);
    Par :
    final String info = "Stopped GrouperSession: " + session;
    session.stop();
    DebugLog.info(info);
pages développeurs
pages "communauté ESCO"