# Webbasierte Anwendung - Authentifizierung über LDAP/ActiveDirectory



## lifeisbeautiful (11. Jul 2018)

Hallo zusammen,

ich schreibe meine Bachelorarbeit in einem Unternehmen und programmiere eine web-basierte Anwendung mit Java EE. Im Grunde ist die Anwendung auch so gut wie fertig. Jedoch fehlt mir noch eine letzte Funktionalität: Die Authentifizierung. Das soll über LDAP/Active Directory umgesetzt werden. Die Programmierung der Anwendung verlief ganz gut. Nur habe ich sehr große Wissens-Lücken bzgl. LDAP und Active Directory.

Im Active Directory hat mein Betreuer eine Gruppe angelegt. In dieser Gruppe sind alle Nutzer eingetragen, die in Zukunft Zugriff auf diese web-basierte Anwendung haben. Mein Vorhaben ist der Folgende:

Ich muss durch LDAP im Active Directory überprüfen, ob der Nutzer, der einen Login durchführen möchte, sich in dieser Gruppe befindet. Wenn ja, ist der Login erfolgreich, wenn nicht, dann hat er keinen Zugriff.

Dementsprechend muss auch überprüft werden, ob das eingegebene Passwort korrekt ist.

Ich habe einen Usernamen und Passwort, womit ich mich erst einmal in den LDAP-Server anmelden kann. Diese Anmeldeinformationen haben erst einmal nichts mit dem Login zu tun. Das ist nur für den Zugriff auf den LDAP-Server.

Das Prinzip ist mir zwar klar, aber ich um ehrlich zu sein nicht den blassen Schimmer, wie ich das angehen soll? Ich habe zuvor noch nie mit LDAP und Active Directory etwas zu tun gehabt. ich habe bisher lediglich nur Anwendungen geschrieben.

Nun weiß ich einfach nicht, wie das umgesetzt werden soll. Wie muss ich denn die Suche in LDAP umsetzen?  Wie suche ich denn durch LDAP im Active Directory nach Usern bzw. Gruppen? Was muss ich beachten? Habt ihr eventuell Code-Beispiele für mich? Oder ein Buch, das mein Vorhaben einigermaßen gut beschreibt?

Ich freue mich über jeden kleinen Tipp.

Freundliche Grüße


----------



## mihe7 (11. Jul 2018)

Kleiner Tipp:
https://symbiotics.co.za/how-to-configure-ldap-authentication-for-your-jee-application/


----------



## fhoffmann (11. Jul 2018)

https://directory.apache.org/conference-materials.data/szoerner-berlinjar-ldap.pdf


----------



## JuKu (5. Aug 2018)

LDAP ist in der Tat nicht das einfachste Thema.
Prinzipiell ist ein LDAP auch eine Art Ordner-Struktur (mal stark vereinfacht gesprochen), wobei jeder Ordner meist mit einem "cn=" anfängt. Und jetzt gibt es 2 Möglichkeiten:
Entweder du kennst den Ordner nicht und durchsucht quasi sämtliche Verzeichnisse nach dem User ab (ziemlich unpraktikabel und wird auch eig. fast nie gemacht) oder du kennst bereits den Ordner und suchst in dem Ordner nach dem User.

Prinzipiell ist das Vorgehen also wie folgt:
1. Anmelden beim LDAP Server (mit den Zugangsdaten des Nutzers --> dadurch weißt du schon, dass die Authentifizierungsdaten wie Username & Passwort stimmen) und
2. prüfen der Berechtigungen (also ob der Nutzer Mitglied in der Gruppe ist).

Hier mal ein älteres (und nicht ideales) Code-Beispiel für den Login, allerdings habe ich das nur zum Testen schnell zusammen gebaut:
https://github.com/JuKu/mmo-proxy-s...usoft/mmo/proxy/database/login/LDAPLogin.java


----------



## JuKu (5. Aug 2018)

Oder noch ein besseres Code-Beispiel aus einem Open Source Projekt, bei dem ich selbst mitarbeite:

```
try (LdapConnection conn = new LdapNetworkConnection(host, port)) {
                //set timeout
                ((LdapNetworkConnection) conn).getConfig().setTimeout(TIMEOUT_LIMIT_SECONDS * 1000L);

                //login to ldap server
                conn.bind("uid=" + username + ",cn=users,cn=accounts,dc=example,dc=com", password);

                SearchRequest req = new SearchRequestImpl();
                req.setTimeLimit(TIMEOUT_LIMIT_SECONDS);
                req.setScope(SearchScope.SUBTREE);
                req.addAttributes("memberOf");
                req.setBase(new Dn("cn=users,cn=accounts,dc=example,dc=com"));
                req.setFilter("(&(uid=" + username + ")(memberOf=cn=" + groupName + ",cn=privileges,dc=example,dc=com))");

                SearchCursor cursor = conn.search(req);

                if (cursor.next()) {
                    //
                } else {
                    group = -1;//user is not in group
                    throw new BadCredentialsException("You don't have access to use this software!");
                }
                req.abandon();

                conn.unBind();
            } catch (InvalidConnectionException e) {
                throw new BadCredentialsException("LDAP server is down. Please try again later.");
            } catch (IOException e) {
                e.printStackTrace();
                throw new BadCredentialsException(ERROR_WHILE_AUTHENTIFICATING);
            } catch (LdapAuthenticationException ex) {
                throw new BadCredentialsException("Your credentials were not accepted!");
            }


        } catch (LdapException | CursorException e) {
            e.printStackTrace();
            throw new BadCredentialsException(ERROR_WHILE_AUTHENTIFICATING);
        }
```


----------



## JuKu (24. Nov 2018)

Der Thread ist zwar schon etwas älter, aber ich habe heute ein besseres Tutorial zum LDAP Login & Permission Check geschrieben:
http://jukusoft.com/2018/11/24/java-ldap-anbindung-login-berechtigungen-tutorial/


----------

