Il est d'usage courant de personnaliser le schéma de données, en ajoutant des attributs et des classes d'objets spécifiques au client.
OpenDJ permet bien évidemment de définir son propre schéma de données. La déclaration des attributs et classes d'objets est faite dans différents fichiers LDIF, chargés au démarrage de l'instance, et qui se trouvent dans $DJHOME/config/schema
.
Par défaut, après l'installation, on y trouve une quinzaine de fichiers:
cd $DJHOME ls config/schema/ 00-core.ldif 03-changelog.ldif 03-rfc2739.ldif 03-rfc3712.ldif 05-rfc4876.ldif 06-compat.ldif 01-pwpolicy.ldif 03-rfc2713.ldif 03-rfc2926.ldif 03-uddiv3.ldif 05-samba.ldif 02-config.ldif 03-rfc2714.ldif 03-rfc3112.ldif 04-rfc2307bis.ldif 05-solaris.ldif
Les classes d'objets usuelles (organizationalUnit, inetOrgPerson, groupOfNames, etc.) sont définies dans le fichier 00-core.ldif.
Pour ajouter des attributs ou classes d'objets spécifiques, on dispose de plusieurs options :
- Ajouter un fichier
99-user.ldif
dans le répertoireconfig/schema
- Utiliser ldapmodify pour ajouter le contenu d'un fichier ldif
- Utiliser la console
Imaginons que nous voulions ajouter une classe auxiliaire customPerson, qui contiendra les attributs :
- customAccesWeb : flag utilisé par un proxy pour donner ou non l'accès Web. Mono valeur
- customStartDate : date de début de contrat
- customEndDate : date de fin de contrat
- customManagerID : ID / matricule du manager
Modification via le fichier 99-user.ldif
Cette modification doit se faire lorsque l'annuaire est arrêté, puisque les fichiers sont chargés au démarrage de l'instance.
On va créer un fichier $DJHOME/config/schema/99-user.ldif
, qui contient :
dn: cn=schema objectClass: top objectClass: ldapSubentry objectClass: subschema cn: schema attributeTypes: ( customStartDate-oid NAME 'customStartDate' DESC 'Date de debut de contrat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'user defined' ) attributeTypes: ( customManagerID-oid NAME 'customManagerID' DESC 'ID du manager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'user defined' ) attributeTypes: ( customAccesWeb-oid NAME 'customAccesWeb' DESC 'Acces Web via Proxy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'user defined' ) attributeTypes: ( customEndDate-oid NAME 'customEndDate' DESC 'Date de fin de contrat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'user defined' ) objectClasses: ( customPerson-oid NAME 'customPerson' DESC 'Person custom' SUP top AUXILIARY MAY ( customAccesWeb $ customStartDate $ customEndDate $ customManagerID) X-ORIGIN 'user defined' )
Une fois l'instance OpenDJ démarrée, on peut vérifier que la nouvelle classe d'objet est créée, en interrogeant la base cn=schema :
$DJHOME/bin/ldapsearch -D "cn=Directory Manager" -w secret -h localhost -p 1389 -b cn=schema -s base "objectclass=ldapSubentry" objectclasses
Note : la commande ci-dessus récupère toutes les classes d'objet. Il n'est pas possible de filtrer directement sur la classe qui nous intéresse.
Modification via ldapmodify
Avec cette option, on va créer un fichier LDIF, qui contient des instructions de modification du schéma. Par exemple :
dn: cn=schema changetype: modify add: attributeTypes attributeTypes: ( customAccesWeb-oid NAME 'customAccesWeb' DESC 'Acces Web via Proxy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'user defined' ) dn: cn=schema changetype: modify add: attributeTypes attributeTypes: ( customStartDate-oid NAME 'customStartDate' DESC 'Date de debut de contrat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'user defined' ) dn: cn=schema changetype: modify add: attributeTypes attributeTypes: ( customEndDate-oid NAME 'customEndDate' DESC 'Date de fin de contrat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'user defined' ) dn: cn=schema changetype: modify add: attributeTypes attributeTypes: ( customManagerID-oid NAME 'customManagerID' DESC 'ID du manager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'user defined' ) dn: cn=schema changetype: modify add: objectClasses objectClasses: ( customPerson-oid NAME 'customPerson' DESC 'Person custom' SUP top AUXILIARY MAY ( customAccesWeb $ customStartDate $ customEndDate $ customManagerID) X-ORIGIN 'user defined' )
Note : on utilise ici des OID alphabétiques (tel que customPerson-oid). Si on veut utiliser des "vrais" OID, on peut les déclarer sur le site de l'IANA (http://www.iana.org/assignments/enterprise-numbers/enterprise-numbers), ou utiliser une plage d'adresse propre, afin d'avoir des OID plus structurés. La tranche 1.3.6.1.4.1 est réservée aux codes privés pour les entreprises. On peut ensuite décliner les numéros par typologie. Par exemple :
- 1.3.6.1.4.36733 : Forgerock
- 1.3.6.1.4.XXXX : Société XX
- 1.3.6.1.4.XXXX.1 : Schéma LDAP Société XX
- 1.3.6.1.4.XXXX.1.1 : Attributs du schéma LDAP Société XX
- 1.3.6.1.4.XXXX.1.2 : Classes d'objets du schéma LDAP Société XX
Dans ce schéma de numérotation, on aurait donc
dn: cn=schema changetype: modify add: attributeTypes attributeTypes: ( 1.3.6.1.4.XXXX.1.1.1 NAME 'customAccesWeb' DESC 'Acces Web via Proxy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'user defined' ) dn: cn=schema changetype: modify add: attributeTypes attributeTypes: ( 1.3.6.1.4.XXXX.1.1.2 NAME 'customStartDate' DESC 'Date de debut de contrat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'user defined' ) dn: cn=schema changetype: modify add: objectClasses objectClasses: ( 1.3.6.1.4.XXXX.1.2.1 NAME 'customPerson' DESC 'Person custom' SUP top AUXILIARY MAY ( customAccesWeb $ customStartDate $ customEndDate $ customManagerID) X-ORIGIN 'user defined' )
La modification du schéma se fait ensuite via une commande ldapmodify :
$DJHOME/bin/ldapmodify -h {host} -p {port} -D {bindDN} -w {password} -f {path to ldif}
Par exemple :
bin/ldapmodify -f ldif/customPerson.ldif -D "cn=Directory Manager" -w secret -h localhost -p 1389 -c
On utilise ici le port LDAP (1389 dans notre exemple) car il s'agit bien d'opérations LDAP et pas d'une opération de configuration de OpenDJ.
On peut vérifier dans le répertoire $DJHOME/config/schema
qu'il existe maintenant un fichier 99-user.ldif
:
cat $DJHOME/config/schema/99-user.ldif dn: cn=schema objectClass: top objectClass: ldapSubentry objectClass: subschema cn: schema attributeTypes: ( customStartDate-oid NAME 'customStartDate' DESC 'Date de debut de contrat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'user defined' ) attributeTypes: ( customManagerID-oid NAME 'customManagerID' DESC 'ID du manager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'user defined' ) attributeTypes: ( customAccesWeb-oid NAME 'customAccesWeb' DESC 'Acces Web via Proxy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'user defined' ) attributeTypes: ( customEndDate-oid NAME 'customEndDate' DESC 'Date de fin de contrat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'user defined' ) objectClasses: ( customPerson-oid NAME 'customPerson' DESC 'Person custom' SUP top AUXILIARY MAY ( customAccesWeb $ customStartDate $ customEndDate $ customManagerID) X-ORIGIN 'user defined' ) modifiersName: cn=Directory Manager,cn=Root DNs,cn=config modifyTimestamp: 20150702081653Z
Modification par la console
Avec OpenDJ, on peut bien évidemment utiliser la console d'administration pour réaliser ces modifications.
Une fois connecté, choisir Schéma / Gérer le schéma :
On peut alors choisir de gérer les attributs ou les classes d'objets. On peut créer un nouvel attribut ou une nouvelle classe d'objet avec un clic droit :
La fenêtre de saisie permet de rentrer les informations de base : nom de l'attribut, OID, description et type. Mais elle présente également d'autres options : type (mono / Multi-valué), attribut parent, alias, fichier de définition, Matching Rules.
Cerise sur le gateau : lorsque l'on confirme, la console affiche l'équivalent de la commande utilisée en ligne de commande :
L'ajout d'une classe d'objet se faire de la même manière. Ici aussi le formulaire permet de saisie quelques options, telles que le fichier de configuration ou le type de classe d'objet (structurelle / auxiliaire). On peut choisir quels sont les attributs portés par la classe d'objet.
Au final, on a un nouvel attribut et une nouvelle classe d'objet :
Références
Guide d'administration OpenDJ / Forgerock : https://backstage.forgerock.com/#!/docs/opendj/2.6.0/admin-guide#chap-s…