JNDI LDAP

Status
Nicht offen für weitere Antworten.

byte

Top Contributor
Moin,

ich möchte eine LDAP-Autorisierung mit Java prüfen. Dabei verbinde ich mich mit JNDI zum LDAP und gucke einfach nur, ob keine Exception fliegt (dann hat die Verbindung wohl geklappt und Username/Passwort sind korrekt).

Code:
        Hashtable<Object, String> env = new Hashtable<Object, String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://host:port");
        env.put(Context.REFERRAL, "follow");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, username);
        env.put(Context.SECURITY_CREDENTIALS, password);
        try {
            DirContext ctx = new InitialDirContext(env);
            ctx.close();
            return true;
        }
        catch (Exception e) {
            return false;
        }

Mein Problem ist nun folgendes: das ganze funktioniert nur, wenn ich als username den konkreten Pfad als DN angebe, also z.b. username = "cn=username,cn=Users,dc=bla,dc=blub". Es liegen jedoch nicht alle User an der gleichen Stelle im LDAP. Eine Kombination aus DN und Filter funktioniert leider auch nicht (username = "dc=bla,dc=blub?cn=username").

Hat jemand eine Idee, wie ich mit mit dem LDAP verbinden kann, ohne dabei den konkreten Pfad zum Userobjekt angeben zu müssen?

Eine andere Möglichkeit wäre ja, wenn man sich mit einem festen User anmeldet und dann eine Suche startet nach dem eigentlichen User. Das Problem daran ist nur, dass das Attribut userPassword nicht sichtbar ist. Ich kann also das Passwort nicht abrufen um zu überprüfen, ob es richtig ist.

Vielleicht kann ja auch jemand ein gutes LDAP-Framework für Java empfehlen?

TIA byto
 

byte

Top Contributor
Habe es dank tfa nun mit einem Ruby Script gelöst: ;)

Code:
#!/usr/bin/ruby
require 'rubygems'
require 'net/ldap'

name=ARGV[0] 
pass=ARGV[1]
host=ARGV[2]

fail "Kein Passwort angegeben" if pass.nil? or pass.empty?
fail "Kein Host angegeben" if host.nil? or host.empty?

ldap=Net::LDAP.new( {:host => 'foo.bar',:port=>0815, 
		     :auth => { :method => :simple, :username => "#{host}\\#{name}", :password => "#{pass}" }} )

fail "Falsches Passwort" unless ldap.bind
 

byte

Top Contributor
Falls es mal wen interessiert: ich habe jetzt eine Lösung mit JNDI gefunden. Man muss sich zunächst entweder anonym oder mit bekannten Benutzerdaten autorisieren. Dann sucht man den Distinguished Name des betreffenden Users, dessen Anmeldedaten geprüft werden sollen:

Code:
            DirContext ctx = new InitialDirContext(env);
            String[] attrIDs = new String[] { "cn" };
            SearchControls searchControls = new SearchControls();
            searchControls.setReturningAttributes(attrIDs);
            searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            NamingEnumeration<SearchResult> answer = ctx.search("", "cn="+username, searchControls);
            ctx.close();
            SearchResult sr = answer.next();
            String userDN = sr.getName();
            return userDN;

Danach versucht man sich mit diesem Namen und dem entsprechenden Passwort anzumelden. Sollte das Attribut userPassword nicht versteckt sein, so kann man natürlich auch direkt den Wert abrufen und vergleichen. Aber häufig kann man das Passwort halt gar nicht abrufen.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben