schneerunzel
Goto Top

PHP LDAP Login

Hallo Zusammen,

ich brauche eine Website auf der man sich mit seinen LDAP Account anmelden kann und dann eine Nachricht eingeben kann die dann in einer .txt abgelegt wird.
Ich stelle mir das ganze so vor:
d4e4768b6983f388017da46298665b86
auf dieser Seite wird nur nach Benutzer und Passwort gefragt mit einem Login Butten. Mir wäre es auch recht wenn eine irgend eine andere Maske kommt. ganz egal. Wichtig ist nur das der Angegeben Benutzer auf der Späteren Seite angezeigt werden kann.

f442c067a1bff20e9abfbb352fae174b
Auf dieser Seite soll der User eine Nachricht eigeben können und dadrüber soll sein Benutzername stehen mit dem er sich gerade angemeldet hat.
Die Nachricht soll dann in einer .txt auf dem Server gespeichert werden. Bei einer neuen Nachricht soll die alte überschrieben werden.

Kann mir jemand dabei helfen. Ich bin Total der PHP Leihe. Die einfachsten Sachen bekomme ich gerade so auf die Reihe.

Hintergrund zu meiner Frage:
Für ein uraltes System muss von extern ab und an mal eine "Aufgaben Key" (z.B. ich brauche eine Liste mit Lagerbeständen, dann gebe ich übers Terminal den Aufgaben Key ein und erhalte per Mail die gewünschte Liste. Die Befehle sehen ungefähr so aus: grlvw user=mmustermann key=5692) Ich würde dann die txt per Python in die entsprechenden Befehle umwandeln. Dies mach gerade da Sinn wo man z.B. nur mit einem Handy im Netz hängt oder sich mit einem Taplate nicht per SSH auf dem Server anmelden möchte.
Ich habe um das System schon viele Sonderlösungen gebaut nur mit dem Aufgaben Keys komme ich nicht weiter.

Vielen Dank für eure Hilfe....

Content-Key: 255639

Url: https://administrator.de/contentid/255639

Ausgedruckt am: 28.03.2024 um 16:03 Uhr

Mitglied: schneerunzel
schneerunzel 22.11.2014 um 13:43:52 Uhr
Goto Top
ach ich habe Vergessen zu erwähnen: ich setzte ein Debian Server mit dem aktuellstem Apache und PHP5 (ebenfalls aktuell) ein. Der LDAP Server ist ein OpenLDAP
Mitglied: colinardo
Lösung colinardo 22.11.2014, aktualisiert am 24.11.2014 um 10:08:17 Uhr
Goto Top
Hallo Schneerunzel,
Kann mir jemand dabei helfen. Ich bin Total der PHP Leihe. Die einfachsten Sachen bekomme ich gerade so auf die Reihe.
OK, dann hast du dir gleich mal was "einfaches" rausgesucht face-wink

Hier mal ein Beispiel:
Wichtiger Hinweis: Wurde nur mal testweise mit einem OpenLDAP-Server auf einem Qnap-NAS getestet.

Benenne das File ldap_login.php und passe die Daten deines LDAP-Servers in Zeile 15-16 an. In Zeile 49 dann noch den Pfad zur Textdatei anpassen die erstellt wird.

WICHTIG: Auf deinem Apache-Server musst du in der php.ini noch die LDAP-Erweiterungen aktivieren und dort die Zeile
extension=php_ldap.dll
auskommentieren.
<?php
session_start();
$errormessage = '';  
$resultmessage = '';  
if (isset($_POST['btnLogout'])){  
	session_unset();
	session_destroy();
}
if (isset($_POST['btnLogin'])){  
	//übergebene Daten speichern
	$username = $_POST['username'];  
	$password = $_POST['password'];  
	
	// Daten des LDAP-Servers
	$domain = 'ou=people,dc=domain,dc=intern';  
	$ldap_server = '192.168.1.22';  
	
	//Distinguished Name des Users setzen
	$userdn = 'uid='.$username.','.$domain;  
	
	// Mit dem LDAP-Server verbinden
	$ds = @ldap_connect($ldap_server);
	
	//Wenn Verbindung erfolgreich ...
	if ($ds){
		//Protokollversion festlegen
		ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
		
		//Versuche mit den übermittelten Credentials eine Verbindung
		if (@ldap_bind($ds,$userdn,$password)){
			// Credentials OK, setze Session-Variablen
			$_SESSION['login_state'] = true;  
			$_SESSION['username'] = $username;  
		}else{
			// Credentials falsch
			$errormessage = "Login fehlgeschlagen!";  
		}
		ldap_close($ds);
	}else{
		echo "Fehler beim Verbinden mit dem LDAP-Server: ".ldap_error($ds);  
	}
}

//Login war erfolgreich
if(isset($_SESSION['login_state']) && $_SESSION['login_state'] == true){  
	// wurde eine Nachricht gesendet
	if(isset($_POST['btnSendMessage']) && $_POST['data'] != ''){  
		// Schreibe die Nachricht in eine Datei
		file_put_contents("demo.txt",$_POST['data']);  
		$resultmessage = "Ihre Daten wurden übertragen und gespeichert!";  
	}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">  
<title>Willkommen</title>
</head>
<style>
body{
	font-family:Arial, Helvetica, sans-serif;
	font-size:0.8em;
}
</style>
<body>
<div id="login" style="width:auto;margin:0 auto;text-align:center">  
<h3>Herzlich Willkommen</h3>
<p>Ihr Benutzername: <strong><?php echo $_SESSION['username']; ?></strong></p>  
<form name="post-data" method="post" action="ldap_login.php">  
<textarea name="data" style="width:300px;height:100px" onFocus="this.value='';">Ihre Nachricht</textarea><br/>  
<input type="submit" name="btnLogout" id="btnLogout" value="Logout" style="width:150px">  
<input type="submit" name="btnSendMessage" id="btnSendMessage" value="Senden" style="width:150px">  
</form>
<p style="color:#0C0;font-weight:bold"><?php echo $resultmessage;?></p>  
</div>
</body>
</html>


<?php 
//LOGIN war nicht erfolgreich oder erster Aufruf der Seite (Zeige Login)
}else{ 
?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">  
<title>LDAP-Login</title>
</head>
<style>
body{
	font-family:Arial, Helvetica, sans-serif;
	font-size:0.8em;
}
#errormessage{
	color:#F00;	
}
</style>
<body>
<div id="login" style="width:320px;margin:0 auto;text-align:center">  
<form name="login" method="post" action="ldap_login.php">  
<table width="100%" border="0" cellspacing="0" cellpadding="0">  
  <tr>
    <td height="30" align="right">Benutzername:</td>  
    <td><input name="username" type="text" style="width:150px"></td>  
  </tr>
  <tr>
    <td height="30" align="right">Password:</td>  
    <td><input name="password" type="password" style="width:150px"><br />  
    <span id="errormessage"><?php echo $errormessage; ?></span>  
    </td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td><input type="submit" name="btnLogin" id="btnLogin" value="Login" style="width:150px"></td>  
  </tr>
</table>
</form>
</div>
</body>
</html>
<?php } ?>

Viel Erfolg
Grüße Uwe

p.s. du siehst es wird Zeit dich nun mehr mit PHP zu beschäftigen face-smile
Mitglied: schneerunzel
schneerunzel 23.11.2014 um 02:07:13 Uhr
Goto Top
vielen Dank für die super schnelle und ausführliche Antwort .......

leider funktioniert das ganze noch nicht so ganz.....

ich bekomme immer als Fehlermeldung "Fehler: No such object"..... Ich würde sagen das ist auf die Verschlüsselung zurückzuführen. Ich werde mir das noch mal in Ruhe ansehen und dann noch mal eine Rückmeldung geben.
Mitglied: colinardo
colinardo 23.11.2014 aktualisiert um 10:23:13 Uhr
Goto Top
das könnte mehrere Ursachen haben, entweder der DN des Admin-Accounts des LDAP ist falsch, oder der DN des gesuchten Users. Ich gehe im Script davon aus das der User in der selben Ebene(OU) die du in Zeile 15 angibst liegt. Der DN wird in Zeile 40 zusammengesetzt. Auf dem Qnap war hier ein uid= Prefix nötig, eventuell liegt da der Hase im Pfeffer.
Jeder LDAP hat da so seine Eigenheiten, da muss man halt etwas testen. Aber ein Grundgerüst hast du damit ja schon mal.

Wäre gut wenn du mal die Zeile nennen könntest in der der Fehler geworfen wird.
Ansonsten mit
error_reporting(E_ALL);
am Anfang der Seite die ausführlichen PHP Errormessages einschalten

Unabdingbar fürs Debugging ist auf jeden Fall ein LDAP-Explorer wie z.B. JXplorer oder LDAPAdmin, welchen du dir mit ins Boot holen solltest.

Grüße Uwe
Mitglied: pantox
pantox 23.11.2014 um 11:14:28 Uhr
Goto Top
Hallo Zusammen,

ich finde es grundsätzlich nicht gut, Passwörter im Quelltext einzubauen und besonders bei denen von Administratoren habe ich mehr als Bauchschmerzen.

Beim Thema LDAP Authentifizierung sollte jeder Benutzer im Verzeichnis in der Lage sein eine ganz wichtige Sache machen zu können, die Selbstauthentifizierung. Also kurz deine Idee aufgegriffen, Verbindung zum Server aufbauen und dann ein bind mit den vom Nutzer eingegebenen Daten versuchen, schlägt dieser fehlt ist entweder der Benutzer unbekannt oder das Passwort falsch.

public function validateCredentials(UserInterface $user, array $credentials)
{
    $server = 'ldap://192.168.175.123';  
    $domain = '@my.domain.suffix';  
    $username = $credentials['username'];  
    $password = $credentials['password'];  
 
    $result = false;
 
    if ($connect=@ldap_connect($server))
    {
      ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
      ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
      if ($bind=@ldap_bind($connect, $username.$domain, $password))
      {
        $result = true;
      }
    }
    ldap_close($connect);
 
    return $result;
  }

Das Codebeispiel ist aus einer Laravel-Anmeldung herrausgerissen (der ganze Beitrag), aber genau diese paar Zeilen ermöglichen die Authentifizierung eines Nutzers. Wie oben gefordert ist der Benutzername ja schon bekannt.

Gruß, Stephan
Mitglied: schneerunzel
schneerunzel 23.11.2014 aktualisiert um 11:49:53 Uhr
Goto Top
Hallo

Hier habe ich einmal ein Export von meinem Testuser (Homer Simpson)....
# Suchbereich: base
# Suchfilter: (objectClass=*)
# Anzahl Einträge: 1
#
# Generated by LDAP Account Manager (http://www.ldap-account-manager.org) on November 23, 2014 10:10 am
# Version: 4.4

version: 1

# Eintrag 1: uid=homer,ou=Users,dc=ldap,dc=fritz,dc=box
dn: uid=homer,ou=Users,dc=ldap,dc=fritz,dc=box
cn: homer
description: Testbenutzer
gidnumber: 513
givenname: Homer
homedirectory: /home/homer
initials: HS
l: Springfield
loginshell: /bin/bash
objectclass: posixAccount
objectclass: inetOrgPerson
objectclass: organizationalPerson
objectclass: person
sn: Simpsons
street: 742 Evergreen Terrace
uid: homer
uidnumber: 10016
userpassword: {SSHA}z5l5/1NeKgzX9XglsHRCwTUX5zB2a1N5

Den ersten Fehler mit "No such object" habe ich gefunden. Die dn wurde vom LDAP Master nicht richtig an den LDAP Slave übergeben. Die Fehlermeldung kam aus der Zeile 49.Hat sich jetzt aber erledigt.

Wenn ich mich jetzt mit homer bekomme ich die Fehlermeldung Kennwort nicht korrekt!.

Kann das was mit der Kennwort Verschlüsselung zutun haben?

Die Zeilen in den ich den LDAP fülle sehen so aus:

 //übergebene Daten speichern
        $username = $_POST['username'];  
        $password = $_POST['password'];  

        // Daten des LDAP-Servers
        $domain = "ou=Users,dc=ldap,dc=fritz,dc=box";  
        $ldap_server = '192.168.159.32';  
        $ldap_user = 'cn=admin,dc=ldap,dc=fritz,dc=box';  
        $ldap_pass = '************';  

(hier habe ich jetzt fest die IP des Masters eingetragen)

@Stephan: ich bin da ganz bei dir das es nicht sonderlich sicher ist das man die PWs im Quelltext eingibt. Ich würde es der Einfachheit halber aber gerne erstmal so lösen und dann wenn ich mich mehr mit PHP auseinander gesetzt habe dann umzustellen. Da ich die Lösung von Uwe mit meinem begrenzten Wissen einigermaßen verstehe (auch dank der sauberen Kommentar) würde ich mich ganz gerne zumindest am Anfang daran halten. Aber vielen Dank für deine Antwort. Ich habe deinen Link schon mal abgespeichert damit ich da später drauf zurück kommen kann. Vielen Dank.

p.s. Als LDAP Explorer nutze ich LAM
Mitglied: colinardo
colinardo 23.11.2014 aktualisiert um 19:56:56 Uhr
Goto Top
Yip liegt an der Verschlüsselung, das Hashing muss an SSHA angepasst werden.
userpassword: {SSHA}z5l5/1NeKgzX9XglsHRCwTUX5zB2a1N5
Melde mich dazu nochmal, muss ich erst testen face-wink

P.s. Die Methode von Stephan ist natürlich schöner, hatte mit LDAP noch nicht so viel am Hut deshalb deshalb mein etwas umständlicher Umweg.
Mitglied: colinardo
colinardo 23.11.2014 aktualisiert um 19:56:46 Uhr
Goto Top
So, Code wurde entsprechend angepasst, nach der vorgeschlagenen Methode von Stephan, war ja eigentlich auch naheliegend, aber manchmal sieht man den Wald vor lauter Bäumen nicht, wenn man tausend Sachen gleichzeitig macht, wie ich im Moment face-smile .
Es muss nun nur noch der DN in dem die User liegen und die Server-IP angepasst werden (Zeilen 16,17).

Grüße Uwe
Mitglied: pantox
pantox 23.11.2014 um 19:49:27 Uhr
Goto Top
Jetzt hab ich nur noch zwei Kleinigkeiten: 1. Zeile 22 und 25 können zusammengefasst werden und 2. wird Stephan mit ph und nicht mit f wie falsch geschrieben.

Griele Füße, Stephan mit ph
Mitglied: colinardo
colinardo 23.11.2014 aktualisiert um 19:58:01 Uhr
Goto Top
Zitat von @pantox:

Jetzt hab ich nur noch zwei Kleinigkeiten: 1. Zeile 22 und 25 können zusammengefasst werden
gut, das ändert jetzt aber nicht die Funktionsweise, macht halt jeder etwas anders face-wink

und 2. wird Stephan mit ph und
nicht mit f wie falsch geschrieben.
oh sorry, wird sofort korrigiert, Asche auf mein Haupt!

Griele Füße
dann verbrenn dir nicht die Füße auf dem Grill face-big-smile

Schönen Abend
Grüße Uwe
Mitglied: schneerunzel
schneerunzel 23.11.2014 um 20:20:34 Uhr
Goto Top
Vielen Dank hat alles super funktioniert......

Dann werde ich mich mal mit php genauer aus einander setzten....

Vielen Dank für eure Hilfe!