Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Benutzerverwaltung leicht gemacht: Teil 1

Geschrieben von: Simon Dotschuweit
Kategorie: ASP Grundlagen

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:

  • In allen Foren die z.B. zwischen Benutzer, Moderatoren und Administratoren unterscheiden müßen, damit ein reibungsloser Ablauf gewährleistet ist.
  • Bei Content-Management Systemen ist es ebenfalls wichtig zu wissen, wer was erstellen, editieren oder löschen darf.
  • Shopping-Systeme, bei denen z.B. Groß- und Privatkunden verschiedene Kaufoptionen zur Verfügung stehen.
  • etc.

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 Scripts

Hier 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:

  • main.asp (src/user/main.asp) - Das Herz unserer Verwaltung, hier können wir alle wichtigen Daten sämtlicher Benutzer auf einen Blick einsehen.
  • dbconn.asp (src/dbconn.asp) -Kümmert sich um die Datenbankverbindung.
  • cookies.asp (src/cookies.asp) - Verwaltet den Zwischenspeicher unserer Eingabemasken.
  • validate.asp (src/validate.asp) - Enthält sämtliche Funktionen, um Benutzereingaben, bzw. Benutzerdaten zu überprüfen.
  • newuser.asp (src/user/newuser.asp) - Die Eingabemaske für einen neuen Benutzer.
  • newuser2.asp (src/user/newuser2.asp) - Dieses Script prüft die eingegebenen Daten und fügt sie in die Datenbank ein.
  • edituser.asp (src/user/edituser.asp) - Eine modifizierte Version des newuser Scripts, es lädt beim Aufruf alle Daten des gewünschten Benutzers und stellt sie zum Editieren bereit.
  • edituser2.asp (src/user/edituser2.asp) - Von der Funktion her ist dieses Script fast genauso wie newuser2 aufgebaut.
  • deluser.asp (src/user/deluser.asp) - Löscht einen bestimmten Benutzer.
  • logoutuser (src/user/logoutuser.asp) - Loggt einen Benutzer aus dem System.

Außerdem benötigen wir folgende Scripts noch für die Benutzerstatusverwaltung:

  • main.asp (src/status/main.asp} - Das Zentrum der Statusverwaltung, hier wird eine Übersicht über alle Benutzerstati gegeben (z.B: admin, user oder host).
  • newstatus.asp (src/status/newstatus.asp} - Die Eingabemaske für einen neuen Status.
  • newstatus2.asp (src/status/newstatus2.asp} - Dieses Script prüft die eingegebenen Daten und fügt sie in die Datenbank ein.
  • editstatus.asp (src/status/editstatus.asp} - Eine modifizierte Version des newstatus Scripts, es lädt beim Aufruf alle Daten des gewünschten Status und stellt sie zum Editieren bereit.
  • editstatus2.asp (src/status/editstatus2.asp} - Von der Funktion her ist dieses Script fast genauso wie newstatus2 aufgebaut.
  • delstatus.asp (src/status/delstatus.asp} - Löscht einen bestimmten Status.

Die Scripts zur Benutzerstatusverwaltung werden nicht eingehend erläutert, da sie technisch fast identisch mit den Benutzerverwaltungsscripts sind (newstatus.asp ~ newuser.asp).

Die Datenbank

Natü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:

Tabelle Feld Typ Beschreibung
Benutzer ID Autowert Einsprungspunkt für den Datenbankzugriff.
" Name Text Der Name des Benutzers.
" Paßwort Text Das Paßwort des Benutzers.
" StatusID Zahl Verbindungspunkt mit der Statustabelle.
" Online Ja/Nein Gibt an, ob der Benutzer gerade Online ist.
" Notizen Text Verschiedene Informationen zum Benutzer.
---------- ---------- ----------- ----------------------------------------------------
Status ID Autowert Einsprungspunkt für den Datenbankzugriff.
" SID Text AbfrageID des Status.
" Name Text Der Name des Status.
" Notizen Text Kann z.B. eine Beschreibung des Status sein.

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 Macht

Da 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 ändern

Die "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ßbemerkung

Damit 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 Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Übergeben von Informationen von einer ASP-Seite zur nächsten
Überprüfen von HTML-Formularen mit ASP
ADO Feld-Abfragen Optimierung
ADO Konstanten und die Datei Adovbs.inc
Aktualisieren von Daten mit dem UPDATE Statement
Auswertung von HTML Formularen mit ASP
Auto-Generierung von performantem Abfragecode
Benutzerverfolgung in ASP
CAPICOM One
Das SQL Join Statement
Datensätze mit dem DELETE Statement löschen
Die SQL ORDER BY Clause
Einfügen eines Datensatzes mit dem INSERT Statement
Gegengifte für SQL Injection
Generieren eines sicheren Paßwortes
Passwörter mit SHA1 absichern
Session Variablen - Verwendung und Stolpersteine
Sicherheitsaspekte bei der Gestaltung von ASP Sites ohne Cookies
SQL Injection

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.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.