Autor Thema: LDAP Zugriffe mit Java (aus Domino)  (Gelesen 3205 mal)

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
LDAP Zugriffe mit Java (aus Domino)
« am: 29.06.07 - 22:50:10 »
Dieser Thread bezieht sich auf Ulrichs Thread: http://atnotes.de/index.php?topic=36782.0

Vielleicht benötigst du die novell libraries gar nicht. Und JNDI reicht aus. Das ist seit Java1.3 Bestandteil des JDK.
Jedenfalls bekomm ich gegen den ApacheDS eine Verbindung ohne Zusatzlibraries.

Code
package de.aja.jndi;

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.InitialDirContext;

public class SimpleJndiExample {

	private InitialDirContext ctx;

	private String intialContextFactory;

	private String providerUrl;

	private String securityPrincipal;

	private String securityCredentials;

	private String securityAuthentification;

	public void initInitialDirContext() throws NamingException {
		Hashtable env = new Hashtable();
		env.put(Context.INITIAL_CONTEXT_FACTORY, intialContextFactory);
		env.put(Context.PROVIDER_URL, providerUrl);

		env.put(Context.SECURITY_PRINCIPAL, securityPrincipal);
		env.put(Context.SECURITY_CREDENTIALS, securityCredentials);
		env.put(Context.SECURITY_AUTHENTICATION, securityAuthentification);

		ctx = new InitialDirContext(env);

	}

	public void printSimpleAttributes() throws NamingException {
		Attributes attrs = ctx.getAttributes("");
		NamingEnumeration enm = attrs.getAll();
		while (enm.hasMore()) {
			System.out.println(enm.next());
		}
	}

	public void setIntialContextFactory(String intialContextFactory) {
		this.intialContextFactory = intialContextFactory;
	}

	public void setProviderUrl(String providerUrl) {
		this.providerUrl = providerUrl;
	}

	public void setSecurityAuthentification(String securityAuthentification) {
		this.securityAuthentification = securityAuthentification;
	}

	public void setSecurityCredentials(String securityCredentials) {
		this.securityCredentials = securityCredentials;
	}

	public void setSecurityPrincipal(String securityPrincipal) {
		this.securityPrincipal = securityPrincipal;
	}

	public static void main(String[] args) {
		SimpleJndiExample jndiEx = new SimpleJndiExample();
		jndiEx.setIntialContextFactory("com.sun.jndi.ldap.LdapCtxFactory");
		jndiEx.setProviderUrl("ldap://127.0.0.1:10389/ou=system");
		jndiEx.setSecurityAuthentification("simple");
		jndiEx.setSecurityCredentials("secret");
		jndiEx.setSecurityPrincipal("uid=admin,ou=system");

		try {
			jndiEx.initInitialDirContext();
			jndiEx.printSimpleAttributes();
		} catch (NamingException e) {
			e.printStackTrace();
			System.exit(0);
		}

	}
}

Sun hat zu JNDI ein Tutorial: http://java.sun.com/products/jndi/tutorial/trailmap.html
Mal schauen, ob mich das irgendwie schlauer macht.

Ich hab von LDAP selbst nicht so die große Ahnung. Ich versuche das in Domino auf eine Weise einzubinden, die imho einfacher ist.

Das Folgende kann eigentlich bei vielen Java Agenten in Notes sinnvoll eingesetzt werden. Es ist eine pragmatische Lösung
Das oben habe ich in ein Eclipse Projekt mit Java1.4.

Nun kann ich diese in Eclipse entwickelte Klasse einfach in einen Notes Java Agenten kopieren.
Und zwar hinter die schliessende Klammer von der Klasse, die Notes da standardmässig reintut.
Beim ersten Speichern kommen erstmal ein paar Compiler-Fehler.
Man muss die import statements des Eclipse Codes nach oben kopieren und das package statement löschen.
Den Method Body äh Inhalt der main Methode von Eclipse kopiere ich nun einfach in den Java-Agenten von Notes.
Beim ersten Lauf meldete dann die Notes debug Console, dass ein Thread nicht richtig entsorgt werden kann. Es fehlte das Schliessen der Connection. Die entsprechende closeConnection-Methode habe ich dann inklusive des Aufrufs hinzugefügt.

Vom Design-Standpunkt existiert jetzt auf Grund des Vorgehens ein eindeutiger separation of concerns Vorteil. Der Zugriffs-Code für LDAP ist in einer eigenen Klasse, die völlig unabhängig von Notes ist und auch unabhängiv von Notes mit besseren Werkzeugen weiterentwickelt und getestetet werden kann. Bei größeren Projekten kann man Eclipse auch ein Jar generieren lassen und das einbinden oder den Code in eine Java Library kopieren. Gerade wenn man aber anfängt bestimmte Sachen auszuprobieren ist dieser hier geschildete Ansatz effizient.

Der Agent sieht jetzt so aus (Hinweis: veraltete Version, neuere s.u.):
Code
import lotus.domino.*;


import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.InitialDirContext;

public class JavaAgent extends AgentBase {

	public void NotesMain() {

		try {
			Session session = getSession();
			AgentContext agentContext = session.getAgentContext();

			SimpleJndiExample jndiEx = new SimpleJndiExample();
			jndiEx.setIntialContextFactory("com.sun.jndi.ldap.LdapCtxFactory");
			jndiEx.setProviderUrl("ldap://127.0.0.1:10389/ou=system");
			jndiEx.setSecurityAuthentification("simple");
			jndiEx.setSecurityCredentials("secret");
			jndiEx.setSecurityPrincipal("uid=admin,ou=system");

		try {
			jndiEx.initInitialDirContext();
			jndiEx.printSimpleAttributes();
			jndiEx.closeConnection();
		} catch (NamingException e) {
			e.printStackTrace();
			System.exit(0);
		}

		} catch(Exception e) {
			e.printStackTrace();
		}
	}
}



class SimpleJndiExample {

	private InitialDirContext ctx;

	private String intialContextFactory;

	private String providerUrl;

	private String securityPrincipal;

	private String securityCredentials;

	private String securityAuthentification;

	public void initInitialDirContext() throws NamingException {
		Hashtable env = new Hashtable();
		env.put(Context.INITIAL_CONTEXT_FACTORY, intialContextFactory);
		env.put(Context.PROVIDER_URL, providerUrl);

		env.put(Context.SECURITY_PRINCIPAL, securityPrincipal);
		env.put(Context.SECURITY_CREDENTIALS, securityCredentials);
		env.put(Context.SECURITY_AUTHENTICATION, securityAuthentification);

		ctx = new InitialDirContext(env);

	}
	
	public void closeConnection() {
		try {
		 ctx.close();
		 } catch (javax.naming.NamingException e) {
		 	e.printStackTrace();
		 }
	}

	public void printSimpleAttributes() throws NamingException {
		Attributes attrs = ctx.getAttributes("");
		NamingEnumeration enm = attrs.getAll();
		while (enm.hasMore()) {
			System.out.println(enm.next());
		}
	}

	public void setIntialContextFactory(String intialContextFactory) {
		this.intialContextFactory = intialContextFactory;
	}

	public void setProviderUrl(String providerUrl) {
		this.providerUrl = providerUrl;
	}

	public void setSecurityAuthentification(String securityAuthentification) {
		this.securityAuthentification = securityAuthentification;
	}

	public void setSecurityCredentials(String securityCredentials) {
		this.securityCredentials = securityCredentials;
	}

	public void setSecurityPrincipal(String securityPrincipal) {
		this.securityPrincipal = securityPrincipal;
	}

	public static void main(String[] args) {
		SimpleJndiExample jndiEx = new SimpleJndiExample();
		jndiEx.setIntialContextFactory("com.sun.jndi.ldap.LdapCtxFactory");
		jndiEx.setProviderUrl("ldap://127.0.0.1:10389/ou=system");
		jndiEx.setSecurityAuthentification("simple");
		jndiEx.setSecurityCredentials("secret");
		jndiEx.setSecurityPrincipal("uid=admin,ou=system");

		try {
			jndiEx.initInitialDirContext();
			jndiEx.printSimpleAttributes();
		} catch (NamingException e) {
			e.printStackTrace();
			System.exit(0);
		}

	}
}


« Letzte Änderung: 30.06.07 - 06:55:46 von Axel Janssen »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: LDAP Zugriffe mit Java (aus Domino)
« Antwort #1 am: 30.06.07 - 06:52:31 »
Da mir die LDAP Zugriffsklasse ein bischen überbeladen vorkam habe ich die Konfiguration der Verbindung in eine eigene Klasse getan, in Eclipse getestet und das ganze wieder nach Notes kopiert.

Der Agent sieht nun so aus:

Code
import lotus.domino.*;


import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.InitialDirContext;

public class JavaAgent extends AgentBase {

	public void NotesMain() {

		try {
			Session session = getSession();
			AgentContext agentContext = session.getAgentContext();
		} catch (lotus.domino.NotesException e) {
			e.printStackTrace();
		}
			InitialContextConfig config = new InitialContextConfig();
		
		config.setIntialContextFactory("com.sun.jndi.ldap.LdapCtxFactory");
		config.setProviderUrl("ldap://127.0.0.1:10389/ou=system");
		config.setSecurityAuthentification("simple");
		config.setSecurityCredentials("secret");
		config.setSecurityPrincipal("uid=admin,ou=system");

		
		try {
			SimpleJndiExample jndiClient = new SimpleJndiExample(config);
			
			jndiClient.printSimpleAttributes();
			jndiClient.closeConnection();
		} catch (NamingException e) {
			e.printStackTrace();
			System.exit(0);
		}
	}
}

class SimpleJndiExample {

	private InitialDirContext ctx;

	public SimpleJndiExample(InitialContextConfig config) throws NamingException {
		ctx = new InitialDirContext(config.getEnv());
	}

	

	public void printSimpleAttributes() throws NamingException {
		Attributes attrs = ctx.getAttributes("");
		NamingEnumeration enm = attrs.getAll();
		while (enm.hasMore()) {
			System.out.println(enm.next());
		}
	}
	
	public void closeConnection() {
		try {
		 ctx.close();
		 } catch (javax.naming.NamingException e) {
		 	e.printStackTrace();
		 }
	}

	

	public static void main(String[] args) {
		InitialContextConfig config = new InitialContextConfig();
		
		config.setIntialContextFactory("com.sun.jndi.ldap.LdapCtxFactory");
		config.setProviderUrl("ldap://127.0.0.1:10389/ou=system");
		config.setSecurityAuthentification("simple");
		config.setSecurityCredentials("secret");
		config.setSecurityPrincipal("uid=admin,ou=system");

		
		try {
			SimpleJndiExample jndiClient = new SimpleJndiExample(config);
			
			jndiClient.printSimpleAttributes();
			jndiClient.closeConnection();
		} catch (NamingException e) {
			e.printStackTrace();
			System.exit(0);
		}

	}
}

class InitialContextConfig {
	private Hashtable env;
	
	private String intialContextFactory;

	private String providerUrl;

	private String securityPrincipal;

	private String securityCredentials;

	private String securityAuthentification;
	
	public InitialContextConfig() {
		env = new Hashtable();
	}
	
	public Hashtable getEnv() {
		return env;
		
	}
	
	public void setIntialContextFactory(String intialContextFactory) {
		this.intialContextFactory = intialContextFactory;
		env.put(Context.INITIAL_CONTEXT_FACTORY, intialContextFactory);
		
	}

	public void setProviderUrl(String providerUrl) {
		this.providerUrl = providerUrl;
		env.put(Context.PROVIDER_URL, providerUrl);
	}

	public void setSecurityAuthentification(String securityAuthentification) {
		this.securityAuthentification = securityAuthentification;

		env.put(Context.SECURITY_AUTHENTICATION, securityAuthentification);

	}

	public void setSecurityCredentials(String securityCredentials) {
		this.securityCredentials = securityCredentials;

		env.put(Context.SECURITY_CREDENTIALS, securityCredentials);

	}

	public void setSecurityPrincipal(String securityPrincipal) {
		this.securityPrincipal = securityPrincipal;
		env.put(Context.SECURITY_PRINCIPAL, securityPrincipal);
	}
	
	public String toString() {
		return "[" + getClass().getName() + "->" +
	    "\nenv=" + env + 
	    "\n]";
	}
	
	
	
}

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz