|
Publicité | ||||||||||||||||||||||
|
|
#1 (permalink) |
|
Membre du Club
![]() |
Bonjour,
J'ai réalisé une application en java / J2EE. Je souhaiterais maintenant connecter cette application à un annuaire LDAP (Novell) en utilisant la librairie JNDI. J'aurais aimé avoir des explications concernant le fonctionnement de cette librairie. Est ce que j'ai besoin de configurer quelque chose pour m'en servir (je sais qu'elle est fournie avec le SDK à partir de la version 1.3 mais y a t-il autre chose que je dois savoir comme des variables à déclarer ou autre) ? Est ce que quelqu'un aurait un exemple simple sur lequel je pourrais m'appuyer ? Je souhaite juste me connecter et consulter des données (pas d'ajout ou de modification) Ensuite, je ne sais du tout dans quelle partie de mon application je dois faire ma connexion (dans la partie métier, data, domain ???) Enfin voilà, je ne sais pas par ou commencer. J'ai lu pas mal de documentation sur le net et sur developpez mais je n'ai pas trouver quelque chose qui m'éclaire suffissament (ou du moins je crois que je n'ai pas trop compris). Si quelqu'un peut me guider pas à pas dans cette démarche, ça serait très gentil. Toute aide sera la bienvenue !!! Merci. |
|
|
|
|
|
#2 (permalink) |
|
Membre du Club
![]() Date d'inscription: avril 2004
Localisation: Nice
Messages: 100
|
Salut, tu utilises quel serveur d'application?
ta connexion au ldap se fait sur ton serveur. sinon j'ai fait ca, si ca peut t'inspirer.... : Code :
import javax.naming.InitialContext; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.BasicAttribute; import javax.naming.directory.BasicAttributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import javax.naming.ldap.Control; import javax.naming.ldap.InitialLdapContext; import javax.naming.ldap.LdapContext; public LDAPConnexion() throws Exception{ //FileInputStream in = (FileInputStream) getClass().getResourceAsStream("/LDAP.properties"); in = getClass().getResourceAsStream("LDAP.properties"); init(); } public LDAPConnexion(FileInputStream in) throws Exception{ this.in = in; init(); } private void init() throws Exception{ Properties env = new Properties(); env.load(in); in.close(); filtreUsr = env.getProperty("filtreUsr"); filtreGroups = env.getProperty("filtreGroups"); groupeGestion = env.getProperty("groupeGestion"); ctx = new InitialDirContext(env); ctls = new SearchControls(); ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); } public static void main(String[] args) { LDAPConnexion application = null; try{ application = new LDAPConnexion(); }catch (Exception e) { e.printStackTrace(); } Attributes a = application.getAttributes("monuser"); application.printAll(a); } private Attributes getAttributes(String login){ NamingEnumeration namingEnumeration = getNamingEnumeration("SAMAccountName="+login,"ou="+filtreUsr); // NamingEnumeration namingEnumeration = getNamingEnumeration("SAMAccountName="+login,"ou=Banking_Users"); if (namingEnumeration == null){ return null; }else{ try{ if (! namingEnumeration.hasMore()){ // System.out.println("! namingEnumeration.hasMoreElements()"); } }catch(Exception e){ e.printStackTrace(); return null; } } SearchResult searchResult = (SearchResult) namingEnumeration.nextElement(); if (searchResult == null){ return null; } return searchResult.getAttributes();//+filtreUsr } } private void printAll(Attributes usr){ Enumeration e = usr.getAll(); while (e.hasMoreElements()) { String element = e.nextElement().toString(); } } } |
|
|
|
|
|
#3 (permalink) |
|
Membre du Club
![]() |
Bonjour,
merci de ta réponse En ce qui concerne le serveur d'application j'utilise Tomcat. Je ne souhaite faire ma connexion sur mon serveur mais plutot l'initialiser dans mon appli un peu comme une connexion à Oracle. Est ce que c'est possible de faire ça Code :
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="${jndi.jdbc.egesco}" /> </bean> Admettons que je fais comme ça pour ma connexion et que ça marche Pour l'instant j'ai cette classe là : Code :
public class JdbcLdapUserDao extends JdbcDaoSupport implements LdapUserDao { private static final String BASE_SQL_LIST_LDAPUSERS_QUERY = "SELECT cn, lastname, firstname FROM t_adm_ldap WHERE cn NOT IN (SELECT cn FROM t_adm_utilisateur)ORDER BY cn"; private static class LdapUserRowMapper implements RowMapper{ public Object mapRow(ResultSet pResultSet, int pRowNum) throws SQLException { LdapUser ldapUser = new LdapUser(); ldapUser.setCommonName(pResultSet.getString("cn")); ldapUser.setLastName(pResultSet.getString("lastname")); ldapUser.setFirstName(pResultSet.getString("firstname")); return ldapUser; } public JdbcLdapUserDao() { super(); } public List listLdapUser() { List ldapUsers = null; ldapUsers = JdbcDaoUtils.listObjects(getJdbcTemplate(),BASE_SQL_LIST_LDAPUSERS_QUERY, null,new LdapUserRowMapper()); return ldapUsers; } } Est ce que tu pourrais me dire ce que je dois modifier ou comment je dois m'y prendre Merci pour ta patience !!! |
|
|
|
|
|
#4 (permalink) |
|
Membre du Club
![]() Date d'inscription: avril 2004
Localisation: Nice
Messages: 100
|
tu peux faire une connexion a ton ldap pour recuperer des données sur une personne.
c'est ce que je fais dans mon init : Code :
private void init() throws Exception{
Properties env = new Properties();
env.load(in);
in.close();
filtreUsr = env.getProperty("filtreUsr");
filtreGroups = env.getProperty("filtreGroups");
groupeGestion = env.getProperty("groupeGestion");
ctx = new InitialDirContext(env); ctls = new SearchControls();
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
}
|
|
|
|
|
|
#5 (permalink) |
|
Futur Membre du Club
![]() |
Moi j'ai un peu exemple de gestion en java du LDAP active directory si ca peut aider:
Code :
// ADConnection - A Java class that encapsulates a JNDI connection to // an Active Directory // // Written by Jeremy E. Mortis mortis@ucalgary.ca 2002-07-03 // // Note that password changes require an SSL connection to the Active Directory, // but other types of calls do not. // // To set up the SSL connection, check out: // http://java.sun.com/j2se/1.3/docs/tooldocs/win32/keytool.html // http://www.microsoft.com/windows2000/techinfo/planning/security/casetupsteps.asp package it.service; import javax.swing.*; import java.awt.*; import javax.naming.*; import javax.naming.directory.*; import javax.naming.ldap.*; import java.util.*; import java.security.*; public class ADConnection { DirContext ldapContext; String baseName = ",cn=users,DC=activedirectory,DC=myorg,DC=ca"; String serverIP = "activedirectory.myorg.ca"; String modelUsername = "template"; public ADConnection() { try { Hashtable ldapEnv = new Hashtable(11); ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); ldapEnv.put(Context.PROVIDER_URL, "ldap://" + serverIP + ":636"); ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); ldapEnv.put(Context.SECURITY_PRINCIPAL, "cn=ldapadmin" + baseName); ldapEnv.put(Context.SECURITY_CREDENTIALS, "xxxx"); ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl"); ldapContext = new InitialDirContext(ldapEnv); } catch (Exception e) { System.out.println(" bind error: " + e); e.printStackTrace(); System.exit(-1); } } public void createNew(String username, String surname, String givenName) { try { String distinguishedName = "cn=" + username + baseName; Attributes newAttributes = new BasicAttributes(true); Attribute oc = new BasicAttribute("objectclass"); oc.add("top"); oc.add("person"); oc.add("organizationalperson"); oc.add("user"); newAttributes.put(oc); newAttributes.put(new BasicAttribute("sAMAccountName", username)); newAttributes.put(new BasicAttribute("userPrincipalName", username + "@" + serverIP)); newAttributes.put(new BasicAttribute("cn", username)); newAttributes.put(new BasicAttribute("sn", surname)); newAttributes.put(new BasicAttribute("givenName", givenName)); newAttributes.put(new BasicAttribute("displayName", givenName + " " + surname)); System.out.println("Name: " + name + " Attributes: " + a); ldapContext.createSubcontext(distinguishedName, newAttributes); } catch (Exception e) { System.out.println("create error: " + e); e.printStackTrace(); System.exit(-1); } } public void createClone(String username, String surname, String givenName) { try { Attributes modelAttributes = fetch(modelUsername); String distinguishedName = "cn=" + username + baseName; Attributes newAttributes = new BasicAttributes(true); newAttributes.put(modelAttributes.get("objectclass")); newAttributes.put(modelAttributes.get("userAccountControl")); newAttributes.put(new BasicAttribute("sAMAccountName", username)); newAttributes.put(new BasicAttribute("userPrincipalName", username + "@" + serverIP)); newAttributes.put(new BasicAttribute("cn", username)); newAttributes.put(new BasicAttribute("sn", surname)); newAttributes.put(new BasicAttribute("givenName", givenName)); newAttributes.put(new BasicAttribute("displayName", givenName + " " + surname)); System.out.println("distinguishedName: " + distinguishedName + " Attributes: " + newAttributes); ldapContext.createSubcontext(distinguishedName, newAttributes); } catch (Exception e) { System.out.println("create clone error: " + e); e.printStackTrace(); System.exit(-1); } } public void update(String username) { try { System.out.println("updating...\n"); ModificationItem[] mods = new ModificationItem[1]; mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("description", "java y")); ldapContext.modifyAttributes("cn=" + username + baseName, mods); } catch (Exception e) { System.out.println(" update error: " + e); System.exit(-1); } } public void updatePassword(String username, String password) { try { System.out.println("updating password...\n"); String quotedPassword = "\"" + password + "\""; char unicodePwd[] = quotedPassword.toCharArray(); byte pwdArray[] = new byte[unicodePwd.length * 2]; for (int i=0; i<unicodePwd.length; i++) { pwdArray[i*2 + 1] = (byte) (unicodePwd[i] >>> 8); pwdArray[i*2 + 0] = (byte) (unicodePwd[i] & 0xff); } System.out.print("encoded password: "); for (int i=0; i<pwdArray.length; i++) { System.out.print(pwdArray[i] + " "); } System.out.println(); ModificationItem[] mods = new ModificationItem[1]; mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("UnicodePwd", pwdArray)); ldapContext.modifyAttributes("cn=" + username + baseName, mods); } catch (Exception e) { System.out.println("update password error: " + e); System.exit(-1); } } public Attributes fetch(String username) { Attributes attributes = null; try { System.out.println("fetching: " + username); DirContext o = (DirContext)ldapContext.lookup("cn=" + username + baseName); System.out.println("search done\n"); attributes = o.getAttributes(""); for (NamingEnumeration ae = attributes.getAll(); ae.hasMoreElements();) { Attribute attr = (Attribute)ae.next(); String attrId = attr.getID(); for (NamingEnumeration vals = attr.getAll(); vals.hasMore();) { String thing = vals.next().toString(); System.out.println(attrId + ": " + thing); } } } catch (Exception e) { System.out.println(" fetch error: " + e); System.exit(-1); } return attributes; } public static void main(String[] args) { Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); // the keystore that holds trusted root certificates System.setProperty("javax.net.ssl.trustStore", "e:\\ldap\\keystore"); System.setProperty("javax.net.debug", "all"); ADConnection adc = new ADConnection(); adc.createClone("clone1", "Clone", "Clarissa"); adc.updatePassword("clone1", "xxxx"); adc.createNew("user1, "User", "Joe"); Attributes a = adc.fetch("clone1"); } |
|
|
|
|
|
#6 (permalink) |
|
Futur Membre du Club
![]() |
Le mieux qu'en tu utilise OpenLDAP ou novell c'est d'utilisé la libraire jldap de novel, elle marche trés bien avec OpenLDAP
tu trouvera la librairie ici: http://developer.novell.com/wiki/index.php/Jldap et des exemple d'utilisation ici: http://www.openldap.org/jldap/overview.html |
|
|
|
|
|
#8 (permalink) | |
|
Membre régulier
![]() Date d'inscription: mars 2006
Âge: 29
Messages: 128
|
Citation:
Bonjour, J'ai vu cotre code et il est tres interessant ! Par contre, j'ai une question (je debute en LDAP et jndi)........si avant des creer un utilisateur, on veut verifier qu'il n'existe pas deja dans l'annuaire, comment fais ton ? Merci pour votre aide ! |
|
|
|
|
|
|
![]() |
||
Connexion Java / LDAP
|
||
| Outils de la discussion | |
|
|