template

Index :: PHP/MySQL :: Passwort-Authentisierung

I.d.R. können Dokumente von jedem aufgerufen werden, sobald sie auf dem Webserver liegen. Manchmal ist es jedoch erforderlich, den Besucher zu identifizieren, z.B. um ihm bestimmte zusätzliche personenbezogene Features anzubieten oder den Zugriff auf Dokumente grundsätzlich zu erlauben bzw. zu verbieten.

Traditionell bedient man sich in solchen Fällen eines Logins, bei dem Anmeldename und Passwort eingegeben werden. Eine erfolgreiche Anmeldung wird dann als Flag (für Zugriff Ok) gespeichert, damit bei nachfolgenden Seitenaufrufen eine globale Prüfung im Hintergrund erfolgen kann.

Bei komplexeren Applikationen, wie etwa einer Intranetanwendung, reicht ein einzelnes Flag allerdings nicht - hier werden dann detailliertere Informationen hinterlegt, z.B. der ausführliche Benutzername oder ein Flag-Array für die vielfältigen Berechtigungen innerhalb der Anwendung.

Für die Speicherung von Konten und Anmeldedaten gibt es eine Reihe von Möglichkeiten (wie Datenbank, Session, Php-Modul, Textdatei oder Cookie), die sich teilweise auch kombinieren lassen. Falls man Konten online verwalten möchte, ist die Verwendung einer Datenbank vorzuziehen, wodurch zudem auch Zugriffsstatistiken leicht realisierbar sind. Falls die Benutzergruppe aber eher statisch ist, reicht es aus, die Konten in einem Modul oder einer Textdatei zu notieren.

Im vorliegenden Beispiel sind die Konten in ein Php-Modul eingepflegt, während die aktuellen Benutzerinfos (Name und Rechte) in der Session festgehalten werden.


Ablauf

Der allgemeine Ablauf zur Berechtigungsprüfung sieht wie folgt aus:

Beim Aufruf einer Seite muss geprüft
werden, ob die Authentisierung besteht.
Dazu wird getestet, ob (z.B. in der Session
oder in der Datenbank) ein entsprechender
Vermerk existiert.
Liegt eine Berechtigung vor? JA Die Seite darf angezeigt werden.
NEIN
Ein Login-Formular wird gezeigt.
Nach Eingabe des Passwortes muss
geprüft werden, ob es korrekt ist.
Ist das angegebene Passwort korrekt? JA Die Berechtigung wird vermerkt.
Dies geschieht z.B. durch Schreiben einer
Session-Variablen oder durch einen
Datenbankeintrag.

Eine Startseite wird gezeigt.
NEIN

Fehler-Seite

Sollte beim Aufruf einer Seite festgestellt werden, dass noch keine Authentisierung vorliegt, wird normalerweise das Login-Formular gezeigt.
Dieses Verhalten ist jedoch bei PopUps nicht empfehlenswert. Die Login-Maske ist zwar klein und passt ins PopUp-Fenster, aber die (bei erfolgreicher Anmeldung) nachfolgend aufgerufene Start-Seite würde ebenfalls im PopUp erscheinen, was nicht in unserem Sinne ist.
Der Einfachheit halber zeigen wir in PopUps daher lediglich eine Fehler-Seite, die den Benutzer über die fehlende Berechtigung informiert.

Auf der Fehler-Seite, die wir hier noacc.html nennen, könnte dann in etwa folgende Meldung erscheinen:

Die Seite kann (oder darf) nicht angezeigt werden.
Dies kann folgende Ursachen haben:

Sie besitzen nicht die erforderliche Berechtigung.

Es wurden ungültige Parameter übergeben.

Sie sind momentan nicht eingeloggt.

Standardprüfung

Wie man im obigen Ablauf sieht, muss jede Seite eine Berechtigungsprüfung durchführen, denn ein Besucher kann ja auf jeder beliebigen Seite einsteigen.
So könnte der Kopf einer Seite aussehen:
Php Einleitung
<?php include('acc.inc.php'); // Pruefungsmodul einbinden if (!acc_ok($rights,$user)) exit; // Pruefungsfunktion aufrufen ?>
Hier folgt die eigentliche Seite...
Sollte noch keine Authentisierung vorliegen, d.h. von acc_ok() wird False geliefert, dann ist die Seite mittels exit sofort zu verlassen.
War die Prüfung jedoch erfolgreich, d.h. von acc_ok() wird True geliefert, dann stehen in den Variablen $rights und $user die entsprechenden Daten des Benutzers, die sich auf der Seite verwerten lassen; z.B. in der Anzeige des Namens oder - gemäß den Rechteflags in $rights - in der Anzeige von zusätzlichen Menüpunkten.

Falls die Seite eine individuelle Berechtigung erfordert, kann dies an Ort und Stelle kontrolliert werden (hier wird z.B. eine Fehler-Seite angezeigt, falls beim Benutzer das 2. RechteBit nicht gesetzt ist):
<?php
include('acc.inc.php');
if (!acc_ok($rights,$user)) exit; 
if (!($rights & 2)) { include('noacc.html'); exit; } // individuelle Pruefung
?>

Modul für die Zugriffsprüfung (acc.inc.php)

Dieses Modul enthält die Funktion acc_ok(). Sie versorgt die ihr übergebenen Parameter $rights und $user mit den entsprechenden Werten, wie sie (bei einem erfolgreichen Login) in der Session hinterlegt wurden.
Der Parameter $logmask bestimmt, ob bei fehlender Authentisierung die Login-Seite oder eine Fehler-Seite (z.B. bei PopUps) angezeigt werden soll.
<?php
@session_start();
function acc_ok(&$rights,&$user,$logmask=true) {
  if (!isset($_SESSION['user'])) { // noch nicht angemeldet
    if ($logmask) include('login.php'); // Login-Seite zeigen
    else include('noacc.html');         // Fehler-Seite zeigen
    return false;
  } else { // Anmeldung ok: gespeicherte Benutzerdaten holen
    $user=$_SESSION['user'];
    $rights=intval($_SESSION['rights']);
    return true;
  }
}
?>

Login-Seite (login.php)

Diese Seite ruft sich selbst auf, um die Eingaben zu kontrollieren. In einem switch-Block wird der Anmeldename geprüft; falls er existiert, wird das erforderliche Passwort festgelegt. Gleichzeitig lassen sich Name und Rechteflags des aktuellen Benutzers zur globalen Speicherung definieren.
Anschließend wird das angegebene Passwort geprüft. Ist es korrekt, dann werden die Benutzerinfos in der Session eingetragen (user und rights) und die Startseite (hier: home.php) wird aufgerufen.
War das Passwort falsch, dann erscheint wieder das Login-Formular.
Php Einleitung
<?php $ok=true; @session_start(); switch ($un=$_POST['un']) { case 'admin': $pw='123geheim'; $un='Administration'; $rights=0xffff; break; case 'mickey': $pw='WaltDisney'; $un='Mickey Mouse'; $rights=0x17; break; case 'donald': $pw='Entenhausen'; $un='Donald Duck'; $rights=0x3; break; default: $ok=false; // unbekannter Anmeldename } if ($ok) { // Anmeldename ist bekannt if (!strcasecmp($pw,$_POST['pw'])) { // Passwort stimmt $_SESSION['user']=$un; $_SESSION['rights']=$rights; // Session-Vars setzen //---- auf Start-Seite verzweigen $i=strrpos($ok=$_SERVER['HTTP_REFERER'],'/'); header('Location: '.substr($ok,0,$i).'/home.php'); exit; } } ?>
Weiter unten, im BODY, das Login-Formular:
<table cellspacing='2' cellpadding='2'> <form name='f_log' action='login.php' method='post'><tr> <td align='right'>Anmeldename</td> <td><input type='text' name='un' size='16' maxlength='16'></td> </tr><tr> <td align='right'>Kennwort</td> <td><input name='pw' type='password' size='16' maxlength='24'></td> </tr><tr> <td></td> <td><input type='submit' class='Button' value='Login'></td> </tr></form></table>

Index :: PHP/MySQL


template