Benutzerverwaltung leicht gemacht: Teil 1
Geschrieben von: Simon Dotschuweit In diesem Artikel möchte ich Ihnen einen relativ einfachen Weg zeigen, mit dem auch Sie eine große Anzahl von Benutzern innerhalb Ihrer Internet-Applikation leicht verwalten und in Ihr System integrieren können. Schließlich kommt irgendwann einmal der Zeitpunkt, wo eine simple Paßwortabfrage nicht mehr ausreicht. Vielleicht möchten sie ja auch, daß nur Benutzer die über einen bestimmten Status verfügen Zugriff auf spezielle Seiten haben, die von anderen nicht gesehen werden sollen. Es gibt viele Beispiele, bei denen solche Systeme zwingende Voraussetzung sind:
Man sieht also, daß effiziente Benutzerverwaltung das A und O jeder komplexeren Web-Applikation ist und eine Menge Zeit sparen kann. Im ersten Teil dieser Serie werden wir uns zuerst um die administrative Seite kümmern, d.h. um die reine Erstellung des Verwaltungssystems, im zweiten Teil folgt dann die Einbindung und Anwendung des Benutzersystems. Liste der ScriptsHier eine Übersicht über alle Scripts, die für die Benutzerverwaltung gebraucht werden und die wir im Anschluß auch gleich erstellen werden: Hier eine Übersicht über alle Scripts, die für die Benutzerverwaltung gebraucht werden und die wir im Anschluß auch gleich erstellen werden:
Außerdem benötigen wir folgende Scripts noch für die Benutzerstatusverwaltung:
Die Scripts zur Benutzerstatusverwaltung werden nicht eingehend erläutert, da sie technisch fast identisch mit den Benutzerverwaltungsscripts sind (newstatus.asp ~ newuser.asp). Die DatenbankNatürlich benötigen wir auch noch eine Datenbank, die sämtliche Informationen der Benutzer speichert. Für diesen Artikel werde ich eine Accessdatenbank verwenden, die zwei Tabellen beinhaltet. Wir nennen die erste Tabelle "Benutzer", die zweite heißt "Status"; alle Felder, die wir benötigen, werden in der folgenden Übersicht aufgelistet:
Natürlich kann die Benutzertabelle auch noch andere Informationen, wie z.B. Adresse, Interessen o.ä. aufnehmen. Das sind jedoch für unser Beispiel nicht relevante Daten, die erst bei der konkreten Anwendung eventuell nötig werden könnten. Die Verbindung zur Datenbank wird im Skript DbConn.asp hergestellt - wer die Datenbank in andere Verzeichnisse legen möchte als im Artikel, muß in diesem Skript Anpassungen vornehmen. NewUser - Wie füllen wir die Datenbank?Kümmern wir uns als erstes um die Eingabemaske. Es wird lediglich eine simple Form benutzt, folgende Modifikationen sind aber interessant: Response.Write "<input type='text' value='" & _ Session( SeID & "_newuser_xxx") & "'>" Um den Komfort zu erhöhen, werden die Daten der Eingabemaske in den Session-Zwischenspeicher geschrieben. Bei Fehleingaben wird dem Benutzer die Maske bereits komplett ausgefüllt präsentiert, damit dieser nicht sämtliche Daten wieder eingeben muß und womöglich den gleichen Fehler noch einmal macht. Damit der Zwischenspeicher auch mit mehreren gleichzeitig offenen Browserfenster immer noch funktioniert und es nicht zu Problemen kommt, wird zusätzlich noch eine Session ID vergeben. Diese besteht aus mehreren Zufallszahlen und der aktuellen Zeit, die zufällig zu unserer ID zusammengewürfelt werden um identische IDs möglichst auszuschließen. Eine weitere Besonderheit ist das Eingabeelement "Status" - eine Dropdownliste, die aus der Status-Tabelle generiert wird: Dim SQL SQL="SELECT Name, ID " SQL=SQL & "FROM Status" Call DBOpen() Set Status = Conn.Execute(SQL) Response.Write "<SELECT Name='status'>" If Session("newuser_sID") = "" Then Response.Write "<OPTION SELECTED value=1>" Else Response.Write "<OPTION value=1>" End If Response.Write "Neuen Status erstellen</OPTION>" Do While Not Status.Eof If Cstr(Session("newuser_status")) = Cstr(Status(1)) Then Response.Write "<OPTION SELECTED value='" Else Response.Write "<OPTION value='" End If Response.Write Status(1) & "'>" & Status(0) & "</OPTION>" Status.MoveNext Loop Response.Write "</SELECT>" Status.Close Set Status = Nothing Call DBClose() Die Liste wird speziell gefüllt - wenn im Session-Zwischenspeicher ein Wert enthalten ist, wird der vom User selektierte Status ausgewählt angezeigt, ansonsten wird die Option "Neuen Status erstellen" angezeigt. Wichtig für den Vergleich der gespeicherten ID mit der gerade in der Abfrage ausgewählten ID ist der Befehl CStr(Variable). Dieser Befehl konvertiert die Variable in einen String, denn unser Vergleich funktioniert nur, wenn wir gleiche Datentypen benutzen und durch diesen Befehl wird dies zwangsweise sichergestellt. Vom Formular newuser.asp geht es nach Klick auf den Submit Button zu newuser2.asp. Dieses Script testet die Daten auf Fehler (wie z.B. auf bereits vorhandene Benutzernamen oder frei gelassene Eingabefelder) und speichert die Daten, sollte der Fehlercheck negativ gewesen sein, in der Datenbank. Sollte ein Fehler auftauchen, wird dieser dem Benutzer angezeigt, und mit dem Zurück-Button kann er die Fehleingabe korrigieren. Hat der Benutzer in newuser.asp die Option zur Erstellung eines neuen Status gewählt, wird er zu newstatus.asp umgeleitet, allerdings müssen dafür vorher noch einige Variablen gesetzt werden. If status = "-1" Then Session("newstatus_refer") = "/user/newuser.asp" Session("newstatus_refervar") = "newuser_status" Response.Redirect "/status/newstatus.asp" End If Die Variable "newstatus_refer" beinhaltet die URL, die nach der Erstellung des neuen Status angesteuert werden soll. Das ist notwendig, damit der Benutzer sofort wieder zur Ausgangsseite, newuser.asp, gelangt. In "newstatus_refervar" wird der Variablenamen definiert, in dem die ID des neu erstellten Status gespeichert werden soll, damit auf der Ausgangsseite der neue Status als Standardauswahl angezeigt wird. Wichtig ist ebenfalls der Test auf einen schon vorhandenen Benutzernamen, damit Doppelnamen vermeidet werden können: 'Erstellung der Auswahlmaske SQL="SELECT Name " SQL=SQL & "FROM Benutzer " SQL=SQL & "WHERE Name='" & username & "'" 'Ausführen der Auswahlmaske Set User = Conn.Execute(SQL) If User.BoF And User.EoF Then 'Hier erfolgt die Speicherung des Benutzers in der 'Datenbank mittels des INSERT-Befehls. Else Response.Write "Ein Benutzer mit diesem Namen" & _ "ist schon vorhanden" End If Sollte also ein Benutzer, dessen Name mit dem Namen des neuen Benutzers übereinstimmt, in der Datenbank gefunden werden, muß ein neuer Benutzername gewählt werden. Main - Das Zentrum der MachtDa wir nun einen oder mehrere Benutzer in der Datenbank haben, werden wir uns nun um die Übersicht kümmern, in der wir alle Benutzer einsehen und verwalten können. Sie besteht, im Grunde lediglich aus einer Tabelle, in der jede Spalte einen Anzeigetyp, wie z.B. Name, Status etc, und jede Zeile einen Benutzer repräsentiert. In der ersten Zeile sind die Spaltenüberschriften, die mit Hilfe von Bildern aufgebaut sind. Weiters wird viel mit Icons gearbeitet, die sowohl als Statusindikatoren und auch als Buttons verwendet werden. Rein technisch gesehen ist dieses Script relativ einfach und simpel gestrickt. Über diesen SQL-Befehl SQLUSER="SELECT Benutzer.ID, Benutzer.Name, Status.Name, " SQLUSER=SQLUSER & "Online, Benutzer.Notizen " SQLUSER=SQLUSER & "FROM Benutzer, Status " SQLUSER=SQLUSER & "WHERE Benutzer.StatusID = Status.ID" werden alle Benutzer aus der Datenbank ausgewählt. Dabei wird anhand der StatusID der Statusname aus der Statustabelle mitermittelt. Im Anschluß wird die Tabelle in einem Loop gefüllt, wobei je nach Zustand der "Online" Variable verschiedene Bilder bzw. Texte zum Einsatz kommen. Anhand der ID werden die Links zum Bearbeiten, Löschen und Ausloggen erstellt, mit denen die Buttons belegt sind: Response.Write "<a href='deluser.asp?ID=" & User(0) &"'>X</a>" Und damit sind wir schon fertig mit diesem Script. EditUser - Alles kann sich ändernDie "edituser"-Scripts sind im Prinzip nur einen Modifikation der "newuser"-Scripts und deshalb werden wir auch nur auf die Modifikationen eingehen. Die gravierendste Änderung besteht darin, daß zu Anfang des "edituser.asp"-Scripts ein Datenbankzugriff erfolgt, der die Daten des gewünschten Benutzers ausliest und sie in die Eingabemaske schreibt, die dann bearbeitet werden kann; dabei sind 2 Optionen möglich: If Request.QueryString("GetMem") Then username = Session("edituser_name") password = Session("edituser_password") stat = Session("edituser_status") notizen = Session("edituser_notizen") Else username = User(1) password = User(2) stat = User(3) notizen = User(4) End If Wenn das Script normal aufgerufen wird, werden die Daten aus der Datenbank verwendet (Else). Sollte es jedoch mit der Option "GetMem=True" geladen werden, dann werden die Werte aus dem Session-Zwischenspeicher verwendet, aber warum das alles? Nun, der Benutzer könnte doch, wie auch im "newuser"-Script, Eingabefehler gemacht haben, sodaß er auf die vorherige Seite zurückzukehren wünscht um die Fehler zu beheben. Dabei würden ihm ohne diese Option alle Veränderungen verloren gehen. Damit sind wir schon fast mit diesem Script fertig, ein wichtiger Wert muß allerdings noch gespeichert werden damit die Überprüfung auf Doppelnamen im nachfolgenden Script korrekt durchgeführt werden kann. Dazu benötigen wir noch den Originalnamen des Benutzers, den wir in einem Zwischenwert festhalten: Session("edituser_oldname") = User(1) Einen Klick auf den Submit Button weiter befinden wir uns auf der Seite "edituser2.asp" - hier müssen wir lediglich die Überprüfung auf Doppelnamen etwas verändern. Denn wir wollen nicht, daß die SQL-Abfrage auch den Originalnamen des Benutzers nicht mehr akzeptiert, da der ja schon in der Datenbank vorhanden ist: 'Erstellung der Auswahlmaske SQL="SELECT Name " SQL=SQL & "FROM Benutzer " SQL=SQL & "WHERE Name='" & username & "' AND Not " SQL=SQL & "(Name='" & Session("edituser_oldname") & "')" 'Ausführen der Auswahlmaske Set User = Conn.Execute(SQL) If User.BoF And User.EoF Then 'Hier erfolgt die Änderung des Benutzers in der 'Datenbank mittels des UPDATE-Befehls. Else Response.Write "Ein Benutzer mit diesem Namen" & _ "ist schon vorhanden" End If Mit dem "Not"-Befehl schließen wir also aus, daß die Abfrage auch den alten Namen findet. Übrigens hat sich auch die Art der Speicherung verändert: Wir benutzen nicht mehr das "INSERT"-Verfahren, sondern "UPDATE"n unseren Benutzer einfach. Logout/ und DelUser - Und Tschüß!Beide Scripts kann man wohl zu Recht als die simpelsten in der ganzen Benutzerverwaltung ansehen, denn beide führen nur einen einfachen Datenbankzugriff aus, wobei das eine einen Benutzer löscht: SQLDEL="DELETE FROM Benutzer " SQLDEL=SQLDEL & "WHERE ID=" & ID Conn.Execute(SQLDEL) Das andere Script setzt die "online" Variable auf False, damit wird der Benutzer als "Offline" betrachtet: SQLLOG="UPDATE Benutzer SET Online=false " SQLLOG=SQLLOG & "WHERE ID=" & ID Conn.Execute(SQLLOG) Damit haben wir alle Scripts der Benutzerverwaltung besprochen. Nun fehlt noch die Statusverwaltung. Da ihre Scripts aber beinahe identisch mit denen sind, die wir schon kennen, werden nur Scripts mit einer wesentlichen Veränderung vorgestellt. NewStatus2 - Wo geht's denn jetzt eigentlich hin?Bei dem zweiten "NewStatus"-Script taucht das Problem auf, daß das vorherige Script, "newstatus.asp" von verschiedenen Seiten aus aufgerufen werden kann. Da wir den Benutzer nach der Erstellung des neuen Status zu der Seite zurückschicken möchten, von der er kam, müssen wir diese Information irgendwo abrufen können. Und da die Seite zu der nun der Link führen soll eventuell auch noch die neue ID des Status bekannt sein sollte, muß dieser Wert erst einmal ermittelt und anschließend gespeichert werden. Wir brauchen nun also die Zwischenwerte, die auf der vorherigen Seite definiert wurden (siehe NewUser). 'Zuerst erfolgt die Speicherung in der Datenbank, dann folgen 'diese Abfragen. If Session("newstatus_refervar") <> "" Then Session(Session("newstatus_refervar")) = GetNewID() End If If Session("newstatus_refer") <> "" Then Response.Redirect Session("newstatus_refer") Else Response.Redirect "main.asp" End If Sollte eine andere Seite einen Variablennamen in "newstatus_refervar" gespeichert haben, wird die neue ID über die GetNewID() Funktion ermittelt und dann in der Zielvariablen gespeichert. Danach wird entschieden, ob die Standardseite, also "main.asp", aufgerufen werden soll, oder ob der Benutzer zu der in "newstatus_refer" definierten Seite umgeleitet werden soll. DelStatus - Safety first!Wenn wir einen Status löschen wollen, können wir nicht so unbesonnen vorgehen, wie wir es bei dem Löschen der Benutzer getan haben. Der Grund dafür ist, daß jedem Benutzer eine Status ID zugewiesen ist. Sollte diese ID nun nicht mehr in der Datenbank existieren, können schwere Fehler auftreten. Wir müssen also überprüfen, ob die ID des Status, den wir löschen wollen, von irgendeinem Benutzer gebraucht wird: SQLSEARCH="SELECT ID, Name " SQLSEARCH=SQLSEARCH & "FROM Benutzer " SQLSEARCH=SQLSEARCH & "WHERE StatusID=" & ID Set User = Conn.Execute(SQLSEARCH) If User.BoF And User.EoF Then 'Hier wird der Status aus der Datenbank gelöscht. Else Response.Write "Folgende Benutzer belegen diesen Status:<br><br>" Response.Write "<table border='0'>" Session("editstatus_refer") = "/status/delstatus.asp?ID=" & ID Do While Not User.Eof Response.Write "<tr><td><b>" & User(1) & "</b>" & _ "</td><td> -> <a href='/user/edituser.asp?ID=" & _User(0) & "'>Status ändern.</a></td></tr>" User.MoveNext Loop Response.Write "</table><br>" Response.Write "Der Status kann nicht belöscht werden," & _ "solange ein Benutzer diesem Status zugewiesen ist." End If Wir verwenden die gleiche Methode wie bei der Überprüfung auf Doppelnamen, in diesem Fall durchsuchen wir aber die Datenbank nach Benutzern, die die gewünschte Status ID besitzen. Sollte keiner gefunden werden, wird der Status gelöscht, ansonsten wird ein Hinweis ausgegeben, der Links zur Bearbeitung der gefundenen Benutzer enthält. Cookies - Zu guter Letzt immer aufräumen!Dieses Script stellt eine Funktion zum Reset der Daten bereit. Da viele andere Scripts darauf Zugriff erlangen müssen, wurde sie isoliert und in dieses Script gestellt, welches nun von jedem anderen mittels der "Include" Methode genutzt werden kann. SchlußbemerkungDamit sind wir am Ende des ersten Artikels in dieser Reihe angelangt. Ich möchte Ihnen aber hier schon einmal einen Ausblick auf den zweiten Teil geben: hauptsächlich wird es um die Einbindung des Systems in vorhandene Webapplikationen gehen, bei denen Sicherheits- und Protokollfragen sowie vieles mehr geklärt werden müssen. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Übergeben von Informationen von einer ASP-Seite zur nächsten Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |