Wikiraum

Benutzer-Werkzeuge

Webseiten-Werkzeuge


Das Login-Formular

Das Loginformular kann eine beliebige Seite (hier: cms.php) aufrufen, die zu Anfang lediglich ein

$ds = check_auth_ldap($ldapOptionsServer);

enthalten muss. Wenn keine aktive Session vorhanden ist, wird mit einer Fehlermeldung zum Loginformular zurückgeleitet.

login.php
<html>
<head>
		<title>Account f&uuml;r mpbteam.de anlegen</title>
		<meta charset="UTF-8" />
		<meta name="description" content="Account f&uuml;r mpbteam.de anlegen" />
		<link href="css/style.css" type="text/css" rel="stylesheet" />
</head>
 
<body>
 
<?php
 
$status = $_GET['failure'];
 
if (is_numeric($status)) {
 
	if ($status == 1) {
    		$err_message = 'Unbekannter Sessionfehler.';
	} elseif ($status == 2) {
    		$err_message = 'Unbekannter Sessionfehler.';
	} elseif ($status == 3) {
    		$err_message = 'Nutzername unbekannt.';
	} elseif ($status == 4) {
    		$err_message = 'Loginfehler. Falsches Passwort?';
	} elseif ($status == 5) {
    		$err_message = 'Sie wurden ausgeloggt.';
	} elseif ($status == 6) {
    		$err_message = 'Login oder Passwort fehlen.';
	}
 
}
 
?>
 
<div align="center">
	<form action="cms.php" method="post">
    		<fieldset>
        		<legend>Bitte einloggen</legend>
        		<label for="username">Login:</label>
        		<input type="text" name="username" id="username" class="text" />
        		<label for="password">Passwort:</label>
        		<input type="password" name="password" id="password" class="text" />
        		<input type="submit" value="Anmelden" class="submit" />
    		</fieldset>
	</form>
 
	<?php echo $err_message; ?>
</div>
</body>
</html>

Includefile für LDAP-Daten

In dieser Datei stehen die Serverdaten für den LDAP-Server als assoziatives Array, dass man dann an die eigentliche Funktion übergibt. Ggf. braucht man diese Daten ja auch noch für andere Anwendungsfälle und kann sie so zentral ändern.

ldapoptions.inc
$ldapOptionsServer = array(
         'basedn'    => 'ou=users,ou=subtree,dc=domain,dc=tld',
         'host'      => 'localhost',
         'port'      => '389',
	 'SessionTimeOut' => '300'
	);

Funktion für das Handling der Session gegen LDAP

Diese Funktion basiert auf diesem Code. Sie wurde erweitert, damit auch ein Login basierend auf der uid möglich ist. Mit der uid wird die für den userbasierten Bind notwendige cn ermittelt. Es müssen als $_POST-Parameter die Variablen 'username' und 'password' übergeben werden. Wenn man mit $_GET ( z.B. login.php?logout=true) die Variable 'logout' (Inhalt egal) übergibt, wird die Session geschlossen und zur Loginseite weitergeleitet.

ldap_session.php
function check_auth_ldap ($ldapOptionsServer) {
 
  // check for inputs or running session
 
  if (!($_POST['username'] && $_POST['password'] && !isset($_SESSION)) {
 
	header("Location: login.php?failure=6");
 
  }
 
  $sessionTimeoutSecs = $ldapOptionsServer['SessionTimeOut'];
  $ldapServer = $ldapOptionsServer['host'];
  $ldapBaseDN = $ldapOptionsServer['basedn'];
  $ldapPort = $ldapOptionsServer['port'];
  $ldapFilter = "(&(objectClass=*)(uid=".$_POST['username']."))";
  $ldapAttributes = array("cn");
 
  if (!isset($_SESSION)) session_start();
 
  // if session is not empty, not timed out or not requested to be closed make a new one
 
  if (!empty($_SESSION['lastactivity']) && $_SESSION['lastactivity'] > time() - $sessionTimeoutSecs && !isset($_GET['logout'])) {
 
    // Session is already authenticated
    $ds = ldap_connect($ldapServer, $ldapPort);
    $sr = ldap_search($ds,$ldapBaseDN,$ldapFilter,$ldapAttributes);
    $result = ldap_get_entries($ds, $sr);
 
    if ($result) {
        $binddn = $result[0]['dn'];
    } else {
    	header("Location: login.php?failure=1");
    }
 
    ldap_close ($ds);
 
    $ds = ldap_connect($ldapServer, $ldapPort);
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
 
    // refresh timeout or close session if timeout is reached
 
    if (ldap_bind($ds, $binddn, $_SESSION['password'])) {
      $_SESSION['lastactivity'] = time();
      return $ds;
    } else {
      unset($_SESSION['lastactivity'], $_SESSION['username'], $_SESSION['password']);
      header("Location: login.php?failure=2");
      exit;
    }
 
  } else if (isset($_POST['username'], $_POST['password'])) {
 
    // Handle login requests
    $ds = ldap_connect($ldapServer, $ldapPort);
    $sr = ldap_search($ds,$ldapBaseDN,$ldapFilter,$ldapAttributes);
    $result = ldap_get_entries($ds, $sr);
 
    if ($result) {
        $binddn = $result[0]['dn'];
    } else {
    	header("Location: login.php?failure=3");
    }
    ldap_close ($ds);
 
    $ds = ldap_connect($ldapServer, $ldapPort);
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
 
    if (ldap_bind($ds, $binddn, $_POST['password'])) {
      // Successful auth
      $_SESSION['lastactivity'] = time();
      $_SESSION['username'] = $_POST['username'];
      $_SESSION['password'] = $_POST['password'];
      return $ds;
    } else {
      // Auth failed
      header("Location: login.php?failure=4");
      exit;
    }
 
  } else {
 
    // Session has expired or a logout was requested
    unset($_SESSION['lastactivity'], $_SESSION['username'], $_SESSION['password']);
    header("Location: login.php?failure=5");
    exit;
 
  }
 
}

Mögliche Seite, die Login erfordert

Auf jeder Seite, die ein Login erfordert, muss man lediglich vor der Ausgabe jedweder Inhalte durch

$ds = check_auth_ldap($ldapOptionsServer);

die Gültigkeit der Session prüfen - denn Rest erledigt die Funktion.

cms.php
<?php
 
require('lib_with_function.php');
require('ldapaoptions.inc');
 
$ds = check_auth_ldap($ldapOptionsServer);
 
?>
 
<html>
<head>
 
</head>
 
<body>
You are logged in!<br>
<a href="cms.php?logout=true">Logout</a>
</body>
</html>