# Zugriff auf LDAP



## Tom Hut (27. Jul 2004)

Hallo Forum!

Habe leider durch die Suche nichts gefunden und poste daher meine Frage mal hier hin:

Wie greife ich von Java aus auf ein LDAP zu, welches auf einem Server liegt? 

Ich bräuchte ein kleines Codebeispiel um die API und das JNDI besser zu verstehen. 


Freue mich über jede Hilfe!

Danke.


----------



## Grizzly (27. Jul 2004)

Ich würde Dir da Tips for LDAP User ans Herz liegen.


----------



## Tom Hut (28. Jul 2004)

Danke für den Tipp!

Nun habe ich leider folgendes Problm bzw. bekomme ich einen Fehler in folgender Zeile:


```
InitialContext ctx = new InitialContext(env);
```
    .....
-> Fehler:   
	
	
	
	





```
Attributes answer = ctx.getAttributes("cn=.......
```

die Fehlermeldung dazu:

    The method getAttributes(String, String[]) is undefined for the type Context

das "lustige" daran ist, das ich den code kopiert habe... 

plz help!

danke


----------



## Grizzly (28. Jul 2004)

Hier mal ein etwas älterer Code von mir. Sollte aber noch funktionieren.

```
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.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

public class LDAP3bind {

	public static void main(String[] args) {
		String host = "servername";
		int port = 389;
		int searchScope = SearchControls.SUBTREE_SCOPE;
		String baseDN = "o=organisation,c=de";
		String filter = "objectclass=*";
		// String filter = "sn=Grizzly";
		String returningAttributes[] = {"userPassword"};
		
		Hashtable ldapProps = new Hashtable(11);
		ldapProps.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
		ldapProps.put(Context.PROVIDER_URL, "ldap://" + host + ":" + Integer.toString(port).trim() + "/");
		ldapProps.put("com.sun.jndi.connect.timeout", "10");
		
		// Authentication: none, simple, strong
		ldapProps.put(Context.SECURITY_AUTHENTICATION, "simple");
		// Password
		//ldapProps.put(Context.SECURITY_CREDENTIALS, "password");
		// User
		//ldapProps.put(Context.SECURITY_PRINCIPAL, "cn=Grizzly,ou=organisationunit," + baseDN);
		// Security Protocol like e.g. SSL
		ldapProps.put(Context.SECURITY_PROTOCOL, "SSL");
		
		ldapProps.put("java.naming.ldap.attributes.binary", "userPassword");
		
		LdapContext lctx = null;
		try {
			lctx = new InitialLdapContext(ldapProps, null);
		}
		catch (NamingException exp) {
			System.err.println("Exception while creating Context:\n" + exp);
			exp.printStackTrace();
		}
		
		try {
			SearchControls ctls = new SearchControls();
			ctls.setSearchScope(searchScope);
			ctls.setReturningAttributes(returningAttributes);
			NamingEnumeration answer = lctx.search(baseDN, filter, ctls);
			System.out.println();
			while(answer.hasMore()) {
				printSearchResult(answer.next(), baseDN);
			}
			System.out.println();
		}
		catch (NamingException exp) {
			System.err.println("Exception while reading from Context:\n" + exp);
			exp.printStackTrace();
		}
		
		try {
			lctx.close();
		}
		catch (NamingException exp) {
			System.err.println("Exception while closing Context:\n" + exp);
			exp.printStackTrace();
		}
	}
	
	public static void printSearchResult(Object sres, String baseDN) {
		String objectName;
		try {
			SearchResult sr = (SearchResult)sres;
			if (sr.isRelative()) {
				if (sr.getName().equals("")) {
					objectName = baseDN;
				}
				else {
					objectName = sr.getName() + "," + baseDN;
				}
			}
			else {
				objectName = sr.getName();
			}
			System.out.println("\n---- " + objectName + " ----");
			System.out.println("Name      : " + sr.getName());
			System.out.println("ClassName : " + sr.getClassName());
			System.out.println("Relative  : " + sr.isRelative());
			System.out.println("----------------------------------------");
			Attributes attrs = sr.getAttributes();
			NamingEnumeration ids = attrs.getIDs();
			try {
				while(ids.hasMore()) {
					Object id = ids.nextElement();
					// System.out.println("" + id + " : " + attrs.get(id.toString()).get());
					
					System.out.println("\t" + id + " :");
					NamingEnumeration values = attrs.get(id.toString()).getAll();
					while (values.hasMore()) {
						Object value = values.nextElement();
						System.out.print("\t\t" + value);
						System.out.println(" (" + getPlainText((String)id, value) + ")");
					}
				}
			}
			catch (NamingException exp) {
				exp.printStackTrace();
			}
			System.out.println("----------------------------------------");
		}
		catch (ClassCastException exc) {
			System.out.println("Unexpected Class: " + sres.getClass().getName());
			System.out.println(sres.toString());
		}
	}
	
	public static String getPlainText(String id, Object value) {
		byte byteArray[];
		String result = "";
		
		if (id.equals("userPassword")) {
			byteArray = (byte[])value;
			if (byteArray.length > 0) {
				result = "Binary(" + byteArray.length + ") = ";
				for (int index = 0; index < byteArray.length; index++) {
					result += (char)byteArray[index];
				}
			}
		}
		else {
			result = (String)value;
		}
		return result;
	}
}
```


----------



## Tom Hut (29. Jul 2004)

Hi, danke für den Code. 

Kannst du mit vielleicht noch sagen was 


```
ldapProps.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
```
und

```
ldapProps.put("com.sun.jndi.connect.timeout", "10");
```

bedeutet!

Was genau sagt denn com.sun.jndi.ldap....
und INITIAL_CONTEXT....

Vielen Danke! 

gruß tom[/code]


----------



## Grizzly (29. Jul 2004)

Tom Hut hat gesagt.:
			
		

> Hi, danke für den Code.
> 
> Kannst du mit vielleicht noch sagen was
> 
> ...



Die Erklärung zu INITIAL_CONTEXT_FACTORY kann bspw. in der API nachlesen:
Hier wird die Context-Factory Klasse angegeben.

Was ein Context ganz genau ist, steht auch in der API. (Bin jetzt einfach zu faul eine Zusammenfassung auf Deutsch zu schreiben  ).



			
				Tom Hut hat gesagt.:
			
		

> und
> 
> ```
> ldapProps.put("com.sun.jndi.connect.timeout", "10");
> ...



Mit _com.sun.jndi.connect.timeout_ setzt man, wie am Namen schon zu erkennen, den Timout für den Zugriff auf den LDAP-Server.


----------



## Tom Hut (29. Jul 2004)

D.h. ich muss an diesen EInträgen rein theoretisch nichts ändern.... oder?


----------



## Grizzly (29. Jul 2004)

Tom Hut hat gesagt.:
			
		

> D.h. ich muss an diesen EInträgen rein theoretisch nichts ändern.... oder?


Nein, eigentlich nicht, da es sich ja um Standardwerte handelt.


----------



## tom hut (30. Jul 2004)

ich hab hiermal meinen code,
der läuft zwar, bzw. erzeugt keinen fehler, aber macht trotzdem nicht, was ich denke was er machen sollte...



```
public static void main(String[] args) 
	{
		
				
		String url = "ldap://10.100.0.44/o=Sto AG";
		Hashtable env = new Hashtable();
		env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
		env.put(Context.PROVIDER_URL, url);
		try 
		{
			DirContext ctx = new InitialDirContext(env);
		} 
		catch (NamingException e) {}

		try 
		{	
			DirContext ctx = new InitialDirContext(env);
	        // Specify the ids of the attributes to return
	        String[] attrIDs = {"cn"};//"sn" , "uid", "mail" alternative
	    
	        // Get the attributes requested
	        Attributes answer = ctx.getAttributes("ou=address", attrIDs);//alternative "cn=*name*"
	    
	        NamingEnumeration enum = answer.getAll();
	        while (enum.hasMore()) {
	            Attribute attr = (Attribute)enum.next();
	            System.out.println(attr);
	            //process(attr);
	        }
	    } 
		catch (NamingException e) {}
                }
```

wei einer woran es liegt?

danke


----------



## Grizzly (30. Jul 2004)

Ähm, jetzt wäre es hilfreich, wenn Du noch sagen/schreiben könntest, was erwartungsmäßig passieren sollte und was tatsächlich passiert. :wink:


----------



## Tom Hut (3. Aug 2004)

ähmm, ich möchte das er mir attribute aus dem verzeichnis ausgibt.
passieren tut aber nichts. 
nicht mal ne fehlermeldung...


----------



## Grizzly (3. Aug 2004)

Irgendwie sieht Dein Code aber deutlich anders wie meiner aus. Und bei der URL hast Du noch _o=Sto AG_ dazugeschrieben. :bahnhof:


----------

