Mailinglisten-Archive |
Ich arbeite gerade an einer WWW-Benutzerverwaltung und würde gerne
ein paar Meinungen und Verbesserungsvorschläge zu verschiedenen
möglichen Ansätzen hören.
Eine WWW-Benutzerverwaltung soll ermöglichen, daß verschiedene
Benutzer je nach (Gruppen-)Rechten unterschiedliche Webseiten bzw.
Inhalte angezeigt bekommen. Ihr Name soll in Diskussionsforen schon
eingetragen werden, sie sollen Inhalte editieren können oder einfach
Neuigkeiten seit dem letzten Besuch angezeigt bekommen (und vieles
mehr).
Dazu verwende ich Basic Authentication mit einer MySQL-Datenbank und
wahlweise .htaccess oder PHP_AUTH_USER. Im aktuellen Projekt kommt
die zweite Methode zur Anwendung, weil die Seiten auch ohne
Authentifizierung zugänglich sein sollen, eingetragene Benutzer aber
erweiterte Möglichkeiten haben.
Die Benutzerdatenbank sieht etwa so aus:
Tabelle 1 "wwwuser" enthält die Benutzerdaten userid, username,
password, name, email, url, usw.
Tabelle 2 "wwwgroup" enthält die Gruppendaten groupid, groupname,
titel, beschreibung, usw.
Tabelle 3 "usergroup" ermöglicht eine n:m-Verknüpfung zwischen
wwwuser und wwwgroup und enthält vor allem userid und groupid.
Das ist ein recht allgemeines Konzept und erlaubt beliebige User,
Gruppen und Beziehungen dazwischen. Da ich die Rechte in meinen
Scripten gruppenweise vergebe, muß ich neben den Benutzerdaten auch
immer die Gruppenzugehörigkeit ermitteln:
if ($PHP_AUTH_USER) {
$username=strtolower($PHP_AUTH_USER);
$userdata=mysql("user","select * from wwwuser u, usergroup v
where username='$username' and u.userid=v.userid
order by groupid");
Diese Daten könnte ich in ein zweidimensionales Array einlesen, aber
da sich nur die Gruppenzugehörigkeit unterscheidet, lese ich diese in
eine Liste:
$u=mysql_fetch_array($userdata);
$u['groups']="0";
while ($x=mysql_fetch_array($userdata)) {
$u['groups'].=",".$x['groupid'];
}
Ich habe dann also ein Array $u, daß alle Userdaten ($u['name'] usw.)
und zusätzlich in $u['groups'] eine durch Kommata getrennte Liste der
GruppenIDs des Users enthält. Damit kann ich dann z.B. Benutzern der
Gruppe 1 einen Edit-Knopf anbieten:
if (strstr($u['groups'],",1")) {
echo "<A HREF=\"/edit.php?pfad=".$pfad."\">
<IMG SRC=\"/img/edit.gif\" ALT=\"Inhalt bearbeiten\"
BORDER=0 WIDTH=13 HEIGHT=15></A>";
}
Frage 1: Gibt es bessere (elegantere, schnellere, allgemeinere,...)
Lösungen? Kennt Ihr andere Beispiele?
Frage 2: Da ich im Script mit einer Gruppenliste arbeite, warum mache
ich mir die Mühe und speichere die Gruppen in einer Extra-Tabelle und
nicht gleich in einem Feld der Tabelle wwwuser?
Und noch eine Frage in diesem Zusammenhang: Alle Seiten in diesem
Projekt werden über 7 Server hinweg aus einem Script generiert. Wenn
sich ein Benutzer per Basic Authentication auf einem der Server
anmeldet, liefert der Browser natürlich nur an diesen Server bei
jedem Zugriff die Authentifizierungsdaten. Er muß sich also auf jedem
der 7 Server anmelden, um überall erkannt zu werden. Kennt jemand
einen Trick, um dieses Verfahren zu vereinfachen?
Gruß, Reiner
--
Reiner.Kukulies_(at)_Uni-Koeln.DE * http://www.uni-koeln.de/~ahs02/
php::bar PHP Wiki - Listenarchive