[JAVA] Authentification avec LDAP

Authentification avec LDAP [JAVA] - Java - Programmation

Marsh Posté le 24-10-2007 à 10:17:19    

Bonjour,
 
 
J'ai une application Java qui nécessite un login et mot de passe. En fonction du login et mot de passe, certaines fonctions seront accesibles.
J'aimerai utiliser un annuaire LDAP pour effectuer cette authentification.
 
 
Arbre LDAP : GID+UID+PASSWORD+DROITS (correspondants au GID et à l'UID)
 
 
1) Comment créer mon arbre LDAP ? exemple de fichier ldiff si possible  :jap:  
 
2) Comment interconnecter mon application java et mon annuaire LDAP (jndi,jldap) ?
 
Merci d'avance  [:spikler]  

Reply

Marsh Posté le 24-10-2007 à 10:17:19   

Reply

Marsh Posté le 24-10-2007 à 17:22:11    

[:alkatraz]
L'API d'accès à LDAP fait partie de JavaSE (depuis la version 1.3) avec les package javax.naming et javax.naming.directory
 
2 secondes sur Google et tu auras un exemple de code (par exemple chez Developpez!)

Reply

Marsh Posté le 24-10-2007 à 20:16:10    

Effectivement, je ne savais pas.
 
Donc maintenant j'arrive à me connecter à ma base ldap et lister son contenu. Par contre j'ai eu besoin de ceci :

Code :
  1. ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );


 mais je n'ai pas compris à quoi servait ce Initial_Context  :(  
 
Le problème est donc en partie résolu pour la partie java.
Maintenant il s'agit de créer l'arbre ldap pour faire l'authentification  [:arhendal]

Reply

Marsh Posté le 24-10-2007 à 20:31:36    

J'avais utilisé ce tuto pour apprendre un peu a utiliser JNDI :
 
http://www.jmdoudoux.fr/java/dej/chap034.htm
 
cf partie 34.2.2 pour ta question sur le contexte initial.
 
Et pour l'authentification, tu dois créer un objet personne dans l'annuaire qui contiendra plusieurs attributs dont les suivants:
-uid
-password  
 
(Tu peux utiliser les classes standards LDAP prédéfinies comme la classe person ou une classe dérivée)
 
Si ton annuaire LDAP ne te servira que pour une appli, tu peux stocker les droits directement comme un attribut (multivalué) de ton objet personne.
Sinon, c'est plus compliqué si tu veux faire ca de manière élégante en généralisant pour un nombre quelconque d'applis.


Message édité par torpi le 24-10-2007 à 21:10:57
Reply

Marsh Posté le 25-10-2007 à 11:35:51    

Fort instructif, le cours de jmdoudoux, une vrai bible  :love:  
 
Pour l'authentification, j'ai crée un objet person comme tu me l'a indiqué.
Par contre pour l'authentification, je n'ai pas compris ce que tu entends par attribut multivalué ?
 
Je pensai créer mes personnes d'un coté et d'un autre mes roles . Le problème est de faire une liaison entre la personne et son role , je n'ai pas trouvé l'attribut commun ...

Reply

Marsh Posté le 25-10-2007 à 12:28:32    

Tout le problème est dans la liaison, en fait :)
 
Voilà encore un lien http://articles.mongueurs.net/maga [...] mag65.html
 
Regarde particulièrement la section "Liens entre données".

Reply

Marsh Posté le 25-10-2007 à 13:25:56    

Effectivement, je ne trouve pas comment lier mes users et mes roles (pas d'attributs commun)  
 
Pour le moment je pourrai lier eventuellement mes personnes et roles en liant OU des personnes à l' OU de mes roles mais du coup ca me fait presque créer une OU pour chaque personne :s  
 
Je pense que quelque chose m'échappe etant donné qu'il s'agit d'un annuaire. Cela devrait etre evident de lier un utilisateur à un groupe ...
 
D'autre part je ne sais quel ObjectClass utilisé pour mes roles...
Exemple de roles: ajouter un binaire, créer une playlist...

Reply

Marsh Posté le 25-10-2007 à 14:04:05    

Tu peux utiliser pour tes groupes la classe groupOfUniquesNames :
 
http://www-03.ibm.com/servers/eser [...] Names.html
 
En LDIF-like pour le role AjoutBinaire cela donne :
 
cn=AjoutBinaire
uniqueMember:uid=toto,ou=people,dc=...
uniqueMember:uid=titi,ou=people,dc=...
 
 
Tu utilises l'attribut uniqueMember pour figurer les dn des personnes qui ont ce role (Ici les utilisateurs toto et titi).

Reply

Marsh Posté le 29-10-2007 à 17:49:52    

Super, j'ai maintenant un arbre qui me convient grâce à ta méthode ;)  merci bien
 
Maintenant pour faire plus propre, j'intègre ça dans mon code Java. Malheureusement petit soucis  :D  
 
J'aimerai que mon code insère un nouvel users avec ces attributs (juste username ici).
 

Code :
  1. public void createNew() {
  2.         String username ="programmeur2";
  3.     try {
  4.       String distinguishedName = "dc=projet,dc=fr";
  5.       Attributes newAttributes = new BasicAttributes(true);
  6.       Attribute crn = new BasicAttribute("objectclass" );
  7.       crn.add("top" );
  8.       crn.add("organizationalUnit" );
  9.       crn.add("ou" );
  10.       crn.add("demo" );
  11.       newAttributes.put(crn);
  12.      
  13.       newAttributes.put(new BasicAttribute("cn", username));
  14.       ldapContext.createSubcontext(distinguishedName, newAttributes);
  15.     }
  16.     catch (Exception e) {
  17.       System.out.println("create error: " + e);
  18.       e.printStackTrace();
  19.       System.exit(-1);
  20.     }


 
L'erreur retournée : javax.naming.directory.InvalidAttributeValueException: [LDAP: error code 21 - objectclass: value #2 invalid per syntax];


Message édité par Trailx original le 29-10-2007 à 19:00:59
Reply

Marsh Posté le 31-10-2007 à 19:56:11    

Tu as défini les classes "ou" et "demo" dans le schéma de l'annuaire ?
 
Essaie de créer ton objet sans les deux dernieres classes pour voir ...

Reply

Marsh Posté le 31-10-2007 à 19:56:11   

Reply

Marsh Posté le 03-11-2007 à 13:15:10    

Effectivement, je n'avais pas respecter la structure de mon arbre au niveau des objets  :whistle:  
 
Maintenant j'arrive a creer mon arbre (objets et attributs) avec mon code java... Seulement, je n'arrive pas à faire du "multi-values" pour l'uid de groupOfUniquesNames  :(  
 
J'arrive à ajouter des objets (qui n'existent pas dans mon arbre) ou modifier des attributs  mais impossible de donner 2 valeurs a un attribut :(  
 
uniqueMember:uid=toto,ou=people,dc=...  
uniqueMember:uid=titi,ou=people,dc=...  
 
 
Une idée ?
 
EDIT: l'attribut password de l'objet inetOrgPerson ne fonctionne pas, j'arrive pas lui passer un mot de passe, il y'a une syntaxe précise à respecter genre MD5{pass ?


Message édité par Trailx original le 03-11-2007 à 17:49:15
n°1637660
torpi
Au travail !!!
Posté le 06-11-2007 à 14:55:52  profilanswer
 

Pour donner deux valeurs a un attribut, tu procèdes bien de la même manière que pour l'attribut "objectclass" (cf. plus haut) ?
 
Essaye ca sinon ...
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed

© 2018 Forum. All Rights Reserved.
Code :
  1. import javax.naming.directory.ModificationItem;
  2. String[] values = {"uid=toto,ou=people,dc=...","uid=titi,ou=people,dc=..."};
  3. ModificationItem[] modificationItem = new ModificationItem[2];
  4. for (int i = 0; i < 2; i++) {
  5. BasicAttribute attr = new BasicAttribute("uniqueMember" );
  6. attr.add(values[i]);
  7. modificationItem[i] = new ModificationItem(DirContext.ADD_ATTRIBUTE, attr);
  8. }
  9. ctx.modifyAttributes(dn_de_ton_role, modificationItem);