Einführung

Einführung – Eine Beispielanwendung

Auth-Tutorial

Unser Ziel für dieses Mini-Tutorial ist es, ein System aufzusetzen, die Ihre Seite mit einer einfach zu benutzenden Authentifizierung versieht.

Am Anfang der zu sichernden Seite platzieren Sie folgenden Code:

Typische Benutzung von PEAR::Auth

<?php
require_once "Auth.php";

// Erwartet drei Argumente: der zuletzt übergebene Benutzername,
// die Authorisations-Zustand und das Auth-Objekt
// Sie werden in diesem einfachen Beispiel nicht verwendet --
// aber das sollte Sie nicht davon abhalten nützliche Dinge amit zu tun.
function loginFunction($username null$status null, &$auth null)
{
    
/*
     * Change the HTML output so that it fits to your
     * application.
     */
    
echo "<form method=\"post\" action=\"test.php\">";
    echo 
"<input type=\"text\" name=\"username\">";
    echo 
"<input type=\"password\" name=\"password\">";
    echo 
"<input type=\"submit\">";
    echo 
"</form>";
}

$options = array( 
 
'dsn' => 'mysql://user:password@localhost/database'
 
);
$a = new Auth("DB"$options"loginFunction");

$a->start();

if (
$a->checkAuth()) {
    
/*
     * The output of your site goes here.
     */
}
?>

Die wenigen Zeilen Code initialiseren die Authentifizierung.

Die erste Zeile im obigen Skript inkludiert die Datei aus dem PEAR-Verzeichnis. Es enthält alle notwendigen Code, um PEAR::Auth auszuführen. Als nächstes wird eine Funktion definiert, die das Login-Formular darstellt, mit dem sich ein Besucher der Seite anmelden muss. Sie können die HTML-Formatierungen beliebig ändern.

Da wir eine Datenbank benutzen wollen, um die Login-Daten zu überprüfen, benötigen wir einen korrekten DSN in der Variable $dsn. Er wird benutzt, um sich mit der Datenbank zu verbinden über PEAR::DB. Informationen zum Tabellenschema für die Datenbank oder für die Benutzung anderer Container finden Sie weiter unten.

Danach erzeugen wir das Auth-Objekt. Der erste Parameter gibt den zuverwendenen Speicher-Container an. Da wir eine Datenbank benutzen, übergeben wir DB. Der zweite Parameter ist der Verbindungsparameter für den Speicher-Container. Wir setzen hier den DSN ein. Der dritte Parameter ist der Name der Funktion. die das Login-Formular enthält.

Das Objekt wurde initialisiert und wir müssen prüfen, ob ein Benutzer angemeldet ist. Dazu rufen wir die Methde checkAuth() auf. Wenn sie TRUE zurückliefert, können wir den Inhalt der Seite weiter ausführen.

Optionale Authentifizierung

<?php
// In this test, the file is named "test.php".

require_once "Auth.php";

function 
loginFunction()
{
     
/*
      * Change the HTML output so that it fits to your
      * application.
      */
     
echo "<form method=\"post\" action=\"test.php?login=1\">";
     echo 
"<input type=\"text\" name=\"username\">";
     echo 
"<input type=\"password\" name=\"password\">";
     echo 
"<input type=\"submit\">";
     echo 
"</form>";
}

if (isset(
$_GET['login']) && $_GET['login'] == 1) {
     
$optional true;
} else {
     
$optional false;
}

$options = array(
 
'dsn' => 'mysql://user:password@localhost/database'
 
);
$a = new Auth("DB"$options"loginFunction"$optional);

$a->start();

echo 
"Everybody can see this text!<br />";

if (!isset(
$_GET['login'])) {
     echo 
"<a href=\"test.php?login=1\">Click here to log in</a>\n";
}

if (
$a->getAuth()) {
     echo 
"One can only see this if he is logged in!";
}
?>

Da sist ein kleines Beispiel für einen optionalen Login: Der letzte Parameter $optional des Auth-Konstrukturs kann auf TRUE oder FALSE gesetzt werden. Setzen Sie ihn auf FALSE, dann wird das Login-Formular nicht angezeigt und der Benutzer sieht nur den Text "Everybody can see this text!". Klickt er auf den Link im Text, wird die Seite erneut geladen, aber mit dem GET-Parameter login=1. Jetzt kann er im Formular seine Login-Daten eingeben. Wird er erfolgreich eingeloggt, dann kann er den Text "Everybody can see this text!" sehen und zusätzlich "One can only see this if he is logged in!".

Logout-Funktion

Das folgende Beispiel führt einen "Logout" aus für den aktuellen Benutzer und zeigt danach das Login-Formular erneut.

<?php
$myauth
->start();
if (
$_GET['action'] == "logout" && $myauth->checkAuth()) {
    
$myauth->logout();
    
$myauth->start();
}
?>

In der folgenden Passage betrachten wir die Methoden der Klasse PEAR::Auth genauer.

Diese SQL-Anweisungen (unter MySQL) erzeugen eine Tabelle mit dem Standardschema für die Authentifizierung:

CREATE TABLE auth (
   username VARCHAR(50) default '' NOT NULL,
   password VARCHAR(32) default '' NOT NULL,
   PRIMARY KEY (username),
   KEY (password)
);

Diese Tabelle und ihre Spaltenname sind erforderlich für eine funktionierende Authentifizerung über eine Datenbank notwendig. Wenn das Passwort per standardmäßig per MD5-Hash-Funktion kodiert wird, dann muss die Passwort-Spalte mindestens 32 Zeichen aufnehmen können. Wird eine andere Methode benutzt, wie z.B. DES ("UNIX crypt"), dann muss die Größe entsprechend angepasst werden.

Auth (Previous) Options for controlling the behaviour of Auth (Next)
Last updated: Sun, 19 Dec 2010 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

Note by: marty@pagemiller.com
In the mini-tutorial, there is a section on optional authentication.

The var named $optional should be renamed $required.

The way the demo works, if $optional is true and is used as the fourth parameter, then login is required.

If you named the fourth parameter $required, and if it was false, login would not be required.

The variable name would make more sense to be named $required. Because if it is false, login is not required.

Just my $.02.
Note by: Happy_User
To Frustrated_User:

You're lack of using the Log functions is likely the only problem you have. I had the same issue as you. I turned on the Logging and voila! There was the problem!

(My table name was "Auth" and it was trying to use "auth" -- duh!)
Note by: Frustrated_User
Somehow I think your documentation lacks some essential points, I just get status -3 all the time (authentication failure), the database connection seems to work when I look at the print_r output from the Auth object. I don't get any error messages from the class nor from PHP itself, great job on making debugging easy, my compliments to you (and no, I don't want to use the PEAR::Log class, thanks).

The least thing you guys should do is update the example to use MDB2 instead of DB, I mean come on - how hard is that?? That's obviously the first thing everybody stumbles across.
Note by: niklas@...
A quick FYI for people who want to use the Auth package in a class and use a custom login function. Take the following example:

You have your userclass from which you call the Auth package. You want to use a function from your class as a custom login handler.

Auth.php uses PHPs is_callable to check if the function exists so it might be good to read up on http://php.net/manual/en/function.is-callable.php

The login-function variable can take an array if you need to call a certain class:

array($classreference, 'yourfunction')

I.e:

array($this, "loginFunction")

Or:

new Auth('MDB2', $this->options, array($this, "loginFunction"), $forcelogin);
Note by: chris@tactek.com
Not to be contrary, but the statement in the documentation that "...the MD5 algorithm...is the default encryption..." is a misnomer. Hashing is not encryption. Googling for "hashing is not encryption" will return numerous articles on this common misconception.
Note by: compufreak.info
ts@websafe.pl asked:

Isn't there an error?

$options = array(
'dsn' => "mysql://user:password@localhost/database",
);

right after /database", the comma is not needed, or am I wrong?

-----------------------

This is correct. The comma is not needed. But it is perfectly 'legal'! You may add a Comma after the last array-element. only, because if you add more elements, you won't forget the comma between the old element and the first new element. it will work and it is okay!
Note by: cronimson@yahoo.com
example does not work and i have in the internet for examples and all of them does not work also. can someone post a working sample.. this is frustrating.
Note by: wiesemann
@shelleykm..., please use the support offers on pear.php.net for asking support questions. About the usage of DB here: The example is just a little bit older. If you have suggestions about how it could be improved, please open a bug report via the link that is offered on the footer of this page (next to the link that you've used to file your user note).
Note by: wiesemann
@ts..., the comma isn't needed, that's right. But this isn't an error. PHP accepts the comma, and it makes people's life easier in some sense because you don't have to worry about adding the comma if you add another key/value pair to the $options array.
Note by: ts@websafe.pl
Isn't there an error?

$options = array(
'dsn' => "mysql://user:password@localhost/database",
);

right after /database", the comma is not needed, or am I wrong?
Note by: shelleykm@adelphia.net
Thanks to the above poster for the encryption hint. Unfortunately I don't have it working yet.

Also, why is the "DB" connector listed here? In the PEAR doc it even says DB has been deprecated in favor of MDB2. Why give newbies examples with includes that aren't recommended to use anymore?
Note by: Mario
Just adding one clarification for newbies (as I am).

If you want to test the 2 examples, don't forget that the password in your table must be encrypted.