Cette page détaille la mise en oeuvre de Grouper V2 à Rennes1 : classification adoptée pour les groupes, les mécanismes d'alimentation à partir des bases métier, et les versements dans les annuaires.
Les choix de noms ont été conditionnés par les rendus des différents services (grouper-ui, annuaires) et la gestion par dossiers.
Le dossier de premier niveau (racine) s'appelle "Etablissements" , car nous sommes dans un contexte multi-établissements.
Chaque établissement contient cinq dossiers:
Deux dossiers contiennent les groupes institutionnels (Etudiants , Personnels) et les trois autres les groupes non-institutionnels (Applications et services, Ressources, Autres groupes)
NB : il n'y a pas de dossier Administrateurs à ce niveau : les groupes des administrateurs délégués sont définis dans les dossiers eux-mêmes
Les principes suivants sont adoptés pour construire les arborescences des groupes des personnels et des étudiants:
avec :
Ils sont issus d'Harpege et reflètent les différents niveaux des structures:
Ils sont issus d'Apogee et sont classés par inscription administrative selon le plan de classememnt suivant
année > “Inscription Administrative” > composante > type de diplôme > version de diplôme > version d'étape
Ces groupes peuvent être gérés par un administrateur délégué.
Ils sont classés selon leur type :
Les règles de nommage:
Correspondance_attributs_grouper_ldap.pdf
La synchronisation entre les bases métiers et la base grouper se fait par un outil développé en interne r1 : synchroGrpInstit (esup-commons-2)
Ce programme batch lit les structures Apogée/Harpège et leurs membres et crée un fichier de lot de commandes à la norme "grouper shell" qui contient les ordres de création/modification des groupes et de leurs membres.
Le fichier lot de commande est ensuite exécuté par le shell grouper.
Chaque groupe est géré par son administrateur designé
L'annuaire appelé "ldap global" est l'annuaire LDAP de référence, utilisé pour l'authentification et les recherche de personnes
La synchronisation se fait avec l'outil "LDAPPC"
Les groupes sont placés dans une branche "groups", à plat (pas d'arborescence)
Les appartenances indirectes sont traduites en appartenances indiciduelles directes
La synchronisation met aussi à jour l'attribut "memberOf" de chaque personne
Configuration ldappc :
<?xml version="1.0" encoding="utf-8"?> <ldappc> <grouper> <group-queries> <subordinate-stem-queries> <stem-list> <stem>groupes</stem> </stem-list> </subordinate-stem-queries> </group-queries> <groups structure="flat" root-dn="ou=Groups,${edu.vt.middleware.ldap.base}" ldap-object-class="groupOfNames" ldap-rdn-attribute="cn" grouper-attribute="name" provision-member-groups="false" > <group-members-dn-list list-object-class="groupOfNames" list-attribute="member" /> <group-attribute-mapping ldap-object-class="groupOfNames"> <group-attribute-map group-attribute="displayExtension" ldap-attribute="description" /> </group-attribute-mapping> </groups> <memberships> <member-groups-list list-object-class="inetuser" list-attribute="memberOf" naming-attribute="name" temporary-directory="" /> </memberships> </grouper> <source-subject-identifiers> <source-subject-identifier source="rennes1:ldap" subject-attribute="id"> <ldap-search base="ou=people,${edu.vt.middleware.ldap.base}" scope="subtree_scope" filter="(uid={0})" on-not-found="warn" /> </source-subject-identifier> </source-subject-identifiers> </ldappc> |
L'annuaire est utilisé pour la gestion des droits sur des espaces partagés
La synchronisation se fait avec l'outil "LDAPPC"
Les groupes sont placés dans une unité organisationnelle "groupes", en conservant l'arborescence de la base grouper
L'attribut sAMAccountName reçoit la valeur de l'id_path grouper avec conversion des ":" en "_"
Configuration ldappc :
<?xml version="1.0" encoding="utf-8"?> <ldappc> <grouper> <group-queries> <subordinate-stem-queries> <stem-list> <stem>groupes</stem> </stem-list> </subordinate-stem-queries> </group-queries> <groups structure="bushy" root-dn="ou=GROUPER,ou=rennes1,${edu.vt.middleware.ldap.base}" ldap-object-class="group" ldap-rdn-attribute="cn" grouper-attribute="name" bundle-modifications="false" > <group-members-dn-list list-object-class="group" list-attribute="member" /> <resolver-attribute-mapping ldap-object-class="group"> <resolver-attribute-map resolver-attribute="grouptypead" ldap-attribute="groupType" ldap-attribute-empty-value="-2147483646"/> <resolver-attribute-map resolver-attribute="sAMAccountName" ldap-attribute="sAMAccountName" /> </resolver-attribute-mapping> </groups> </grouper> <source-subject-identifiers> <source-subject-identifier source="rennes1:ldap" subject-attribute="id"> <ldap-search base="ou=rennes1,${edu.vt.middleware.ldap.base}" scope="subtree_scope" filter="(cn={0})" on-not-found="warn" /> </source-subject-identifier> </source-subject-identifiers> </ldappc> |
Résolution des correspondances d'attributs :
<?xml version="1.0" encoding="UTF-8"?> <AttributeResolver xmlns="urn:mace:shibboleth:2.0:resolver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:resolver="urn:mace:shibboleth:2.0:resolver" xmlns:ad="urn:mace:shibboleth:2.0:resolver:ad" xmlns:dc="urn:mace:shibboleth:2.0:resolver:dc" xmlns:grouper="http://grouper.internet2.edu/shibboleth/2.0" xsi:schemaLocation=" urn:mace:shibboleth:2.0:resolver classpath:/schema/shibboleth-2.0-attribute-resolver.xsd urn:mace:shibboleth:2.0:resolver:dc classpath:/schema/shibboleth-2.0-attribute-resolver-dc.xsd urn:mace:shibboleth:2.0:resolver:ad classpath:/schema/shibboleth-2.0-attribute-resolver-ad.xsd http://grouper.internet2.edu/shibboleth/2.0 classpath:/schema/shibboleth-2.0-grouper.xsd"> <!-- group data connector --> <resolver:DataConnector id="groupDataConnector" xsi:type="grouper:GroupDataConnector"> </resolver:DataConnector> <resolver:AttributeDefinition xsi:type="Script" xmlns="urn:mace:shibboleth:2.0:resolver:ad" id="sAMAccountName" sourceAttributeID="name"> <resolver:Dependency ref="groupDataConnector" /> <Script><![CDATA[ // Import Shibboleth attribute provider importPackage(Packages.edu.internet2.middleware.shibboleth.common.attribute.provider); value = name.getValues().get(0); value = value.replaceAll("\\/", "_"); value = value.replaceAll("\\/", "_"); value = value.replaceAll("\\[", "_"); value = value.replaceAll("\\]", "_"); value = value.replaceAll("\\:", "_"); value = value.replaceAll("\\;", "_"); value = value.replaceAll("\\|", "_"); value = value.replaceAll("\\=", "_"); value = value.replaceAll("\\,", "_"); value = value.replaceAll("\\+", "_"); value = value.replaceAll("\\*", "_"); value = value.replaceAll("\\?", "_"); sAMAccountName = new BasicAttribute("sAMAccountName"); sAMAccountName.getValues().add(value); ]]></Script> </resolver:AttributeDefinition> <resolver:AttributeDefinition id="grouptypead" xsi:type="Script" xmlns="urn:mace:shibboleth:2.0:resolver:ad" sourceAttributeID="name" > <resolver:Dependency ref="groupDataConnector" /> <Script><![CDATA[ // Import Shibboleth attribute provider importPackage(Packages.edu.internet2.middleware.shibboleth.common.attribute.provider); value = -2147483646; grouptypead = new BasicAttribute("grouptypead"); grouptypead.getValues().add(value); ]]></Script> </resolver:AttributeDefinition> </AttributeResolver> |