JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Java Naming and Directory Interface (JNDI) Franck Barbier Université de Pau et des Pays de l’Adour
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Nommage La gestion des ressources des systèmes distribués impose leur identification aisée et précise, leur localisation et leur accès par nommage en particulier Internet par exemple est fondé sur une nomenclature qui gouverne le nommage des sites : c’est le DNS ou Domain Name System (e.g. Il existe deux supports de base pour la gestion du nommage : les services de nommage proprement dit (e.g., DNS) et les services de gestion d’annuaire (e.g., la norme X.500 et son implantation standard mais « allégée » qui est LDAP pour Lightweight Directory Access Protocol)
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Exemples de besoins en nommage Environnement d’imprimantes et leurs capacités/possibilités/qualités d’impression en s’affranchissant des serveurs d’impression (pilote d’impression, file d’attente…) Les annuaires, pages blanches, pages jaunes… Les fichiers qui existent physiquement sur des machines différentes mais dont l’accès et la manipulation logiques doivent être transparents et simplifiés Les composants et services logiciels dont la localisation et la composition dynamique dans des applications nécessitent l’identification sure, rapide et fréquente Les utilisateurs des systèmes distribués avec en particulier leurs propriétés « système » telles que , home page…
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Gestion du nommage et programmation J2SE fournit en standard une API complète pour la gestion du nommage : JNDI Cette technologie Java est un support complet pour DNS, LDAP, RMI, CORBA… Elle autorise par exemple la gestion des URLs (Uniform Resource Locators) du Web comme des noms simples ou composites ; on trouve ainsi les interfaces et classes Java : javax.naming.Name, javax.naming.CompositeName et javax.naming.CompoundName
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Java Naming and Directory Interface (JNDI) Package clef : javax.naming Livre : JNDI API Tutorial and Reference: Building Directory-Enabled Java™ Applications, Rosanna Lee and Scott Seligman, Addison Wesley, 2000 Voir aussi ( The Internet Engineering Task Force ) pour les spécifications
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Architecture de JNDI Novell
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Service Provider Un fournisseur de service JNDI doit implémenter toutes les interfaces composant la norme. Les services de base sont en général inclus dans J2SE et il est possible de créer son propre service JNDI-compliant. Voici quelques cas : LDAP (inclus dans J2SE depuis SDK 1.4.0), voir aussi pour déployer un serveur RMI Registry (inclus dans J2SE) DNS (inclus dans J2SE depuis SDK 1.3.0) File System (à télécharger) Windows Registry (à télécharger) Etc. Voir aussi
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Ce package est réservé aux développeurs qui créent un service conforme à JNDI pour traiter d’une technologie particulière. Par exemple, JNDI2R est une réalisation de la société SCAND pour accéder et manipuler le registre de Windows (9x -> XP) en Java Le package javax.naming.spi contient les interfaces que doit implémenter un Service Provider pour offrir un point d’entrée JNDI à une technologie donnée Package Java du Service Provider
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche L’interface javax.naming.Context est l’interface clef de JNDI. Elle définit spécialement les opérations de base pour gérer les objets nommés composés du nom lui- même et de sa liaison (binding). Les liaisons JNDI sont vues comme des objets Java possédant un type qui souvent peut être découvert à l’exécution. Par exemple, un composant logiciel EJB verra sa localisation JNDI retourner un objet d’un type conforme à sa Home Interface. Ce type varie selon le domaine traité : le File System retourne lui par exemple des contextes ou des fichiers (java.io.File) Interface javax.naming.Context
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Organisation des classes et interfaces Java autour de Context Autres interfaces non encore implémentées à ce jour : EventContext, EventDirContext
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Interface Name JNDI définit une représentation standard sous forme de chaîne de caractères des noms composites. Cette représentation est la concaténation des composants d’un composite de la gauche vers la droite en utilisant un séparateur (le slash ou /) pour distinguer chaque élément
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Configuration d’un contexte avant ouverture Paramètre de configuration : INITIAL_CONTEXT_FACTORY java.util.Properties p = new java.util.Properties(); p.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.FSContextFactory"); // File System Service Provider /* or p.setProperty(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.Re fFSContextFactory"); // File System Service Provider */
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Classes pour le service File System implements javax.naming.Context
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Version « light » de la norme X.500 de l’OSI (Directory Service ou service d’annuaire) qui tourne au dessus du protocole TCP/IP Organisation dépendante d’une base de données (X.500 Directory Information Base) plutôt dédiée à des opérations de « lecture seule » et des accès sécurisés Concepts clefs de X.500 : les « entrées » qui ont un DN pour Distinguished Name (i.e., un identifiant) et qui sont structurées selon un DIT ou Directory Information Tree LDAP
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche En tant que protocole, LDPA définit un format de transport des données, des opérations de base comme « chercher », « comparer »… Les mécanismes de recherche sont associés à des filtres/contrôles. Exemple (les personnels de l’UPPA situés à Mont de Marsan et ayant la chaîne de caractères « anc » dans leur nom de famille) : String filterExp = "(&(!(givenName=*anc*))(uppaSite~=mont de marsan))"; NamingEnumeration ne = lc.search("ou=people",filterExp,null); // lc est de type com.sun.jndi.ldap.LdapCtx while(ne.hasMore()) System.out.println(ne.next().toString()); La classe javax.naming.directory.SearchControls est un moyen de personnalisation et d’optimisation des recherches : nombre limite d’entrées retournées, temps limite de recherche, profondeur de la recherche… LDAP, aspects étendus
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Format des données des annuaires LDIF (Lightweight Data Interchange Format) : format d’échange des gestionnaires de messagerie comme ceux intégrés dans Mozilla par exemple (voir fonctions export/import) Directory Services Markup Language (DSML) : c’est une définition de schéma XML pour l’accès et la manipulation ouverts d’informations d’annuaires via des protocoles communs tels que HTTP ou SMTP DSML dispose depuis peu d’un frontal JNDI
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Machine hôte : ldap.univ-pau.fr (port par défaut : 389) avec miroir : scinfe100.univ-pau.fr Accès basé SSL : ldaps://crisv1.univ-pau.fr:636 (nécessité de certificat) Exemple de DN : uid=barbier,ou=people,dc=univ- pau,dc=fr Package Java spécifique : javax.naming.directory Serveur LDAP : un exemple
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche DIT de ldap://ldap.univ-pau.fr
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Toutes les entrées LDAP sont typées (à ne pas confondre avec les types Java des objets nommés lorsqu’ils sont manipulés « programmatiquement ») : Le type d’un objet (eduPerson par exemple qui un type LDAP) précise formellement les attributs obligatoires et optionnels qui peuvent être associés à une entrée donnée (e.g., uid=barbier,ou=people,dc=univ- pau,dc=fr) ayant ce type Typage des données LDAP
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Schéma retenu pour ldap://ldap.univ-pau.fr
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche LDAP : propriétés de type Structural. Indicates the attributes that the entry may have and where each entry may occur in the DIT Auxiliary. Indicates the attributes that the entry may have Abstract. Indicates a "partial" specification in the object class hierarchy; only structural and auxiliary subclasses may appear as entries in the directory
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche Schema Class Definition pour ldap://ldap.univ-pau.fr
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche LDAP 3.0 API étendue dans le package javax.naming.ldap Factory : com.sun.jndi.ldap.LdapCtxFactory (idem LDAP standard) Concepts d’« opération étendue », de « contrôle » et de « notification non sollicitée » Instrumentation via l’interface javax.naming.ldap.Control par exemple pour la notion de contrôle Exemple d’opération étendue : « recherche avec tri »
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche DNS Factory : com.sun.jndi.dns.DnsContextFactory DIT du DNS
JNDI, dernière mise à jour : vendredi 29 septembre 2006 © - groupe de recherche JNDI et CORBA Le service de nommage de CORBA ou CosNaming est natif dans la plate-forme J2SE. Le package clef est org.omg.CosNaming La mise en œuvre via JNDI est possible grâce à la Factory suivante (également native) : com.sun.jndi.cosnaming.CNCtxFactory L’implémentation de l’interface javax.naming.Context est com.sun.jndi.cosnaming.CNCtx Exemple : _p = new java.util.Properties(); _p.setProperty(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.cosnaming.CNCtxFactory"); _p.setProperty(Context.PROVIDER_URL,"iiop://localhost:1170"); _ic = new InitialContext(_p);