Passwort-Login mit ColdFusion

Mit dem seitenbasierten Applikationsserver ColdFusion von Allaire ist die Programmierung eines Moduls für die Besucherregistrierung ein recht einfaches Unterfangen.

Artikel erschienen in Swiss IT Magazine 2001/21

     

Unzählige Websites erfordern, dass sich die Besucher zuerst einmal anmelden. Egal, ob es sich dabei um einen Webshop oder um den geschlossenen Bereich einer Site handelt, das Prozedere ist stets dasselbe: Sofern sich die User bereits registriert haben, können sie sich über eine Anwenderkennung und ein Passwort einwählen. Handelt es sich hingegen um einen neuen Besucher, müssen die Daten zuerst erfasst und dann in einer Datenbank abgelegt werden.



Was die eingesetzten Technologien betrifft, so eignen sich für Anmelde-Routinen am besten Datenbanken, die über eine Middleware wie Microsofts Active Server Pages, PHP oder eben ColdFusion angesprochen werden. Im vorliegenden Workshop werden wir uns auf die letztgenannte Technologie konzentrieren, wobei nicht der Enterprise-taugliche ColdFusion Server, sondern lediglich ColdFusion Express 4.5, eine abgespeckte, dafür aber auch gratis verfügbare Version der Middleware, zum Einsatz kommt.




Als Datenbank nutzen wir Access 2000 aus dem Hause Microsoft; theoretisch könnte aber auch jede ODBC-kompatible Datenbank dienen. Last but not least benötigen wir für das Login-Prozedere die Webserver-Dienste von Windows 2000, wobei auch hier ein beliebiger Webserver eingesetzt werden kann.


Basis-Vorbereitungen

Das Einrichten der drei erwähnten Komponenten lässt sich recht einfach bewerkstelligen. Als erstes wird der IIS über das Software-Applet in der Systemsteuerung von der Windows-CD installiert. Eine Änderung der Basiseinstellungen, die per Default gesetzt werden, drängt sich vorderhand nicht auf.



Nun gilt es, den ColdFusion Express Server zu installieren, der, wie erwähnt, auf der Allaire-Site kostenlos bezogen werden kann. Während dem Setup wird einzig der Pfad zum Root-Verzeichnis des WWW-Servers abgefragt, das defaultmässig unter c:\inetpub\wwwroot abgelegt wird.




Nun erstellen Sie im WWW-Root-Verzeichnis einen neuen Ordner mit der Bezeichnung /login. Hier werden sowohl die Datenbankdatei wie auch die .htm- bzw. die .cfm-Files, wie sie in ColdFusion heissen, abgelegt werden. Nun muss der Ordner noch für die Webfreigabe aktiviert werden. Öffnen Sie per rechter Maustaste das Kontextmenü und wählen Sie den Eintrag Freigabe. Klicken Sie auf das Register Webfreigabe und dann auf den Radio-Button Diesen Ordner freigeben. Daraufhin öffnet sich eine weitere Dialogbox, in der Sie die Checkboxen Schreiben und Scriptzugriff sowie unter Anwendungsberechtigungen den Radio-Button Ausführen aktivieren.




Das Datenbank-Design

Die nächsten Schritte gelten der Vorbereitung der Datenbank sowie der Anbindung der betreffenden Datei an den ODBC-Treiber.



Erstellen Sie im /login-Verzeichnis zuerst eine neue Datenbank, welche die Tabelle Adressen mit folgenden Feldern beinhaltet: Adressnummer, Vorname, Nachname, Strasse, PLZ, Ort, EMail, Benutzer und Passwort. Der Einfachheit halber haben wir Angaben wie Telefonnummern oder Anrede weggelassen.




Um die Datenbank nun über ODBC zugänglich zu machen, öffnen Sie in Windows 9x und NT das ODBC- bzw. ODBC-32-Panel in der Systemsteuerung. Unter Windows 2000 finden sich die betreffenden Einstellungen im Datenquellen-Applet, das in der Systemsteuerung über Verwaltung aufgerufen wird. Klicken Sie auf das Register System-DNS und dann auf den Hinzufügen-Button, worauf Sie den Access-Treiber auswählen und mit Fertig stellen bestätigen. Jetzt tippen Sie unter Datenquellennamen "Registrierung" ein und navigieren zur Datenbank-Datei, indem Sie auf den Auswählen-Button klicken. Zu guter Letzt schliessen Sie mit OK die Dialogbox.




Die Begrüssung

Als erstes generieren wir ein simples Formular, das es einerseits bereits registrierten Anwendern erlaubt, Userkennung und Passwort einzugeben, und andererseits neuen Besuchern den Link zur Registrierungsseite zur Verfügung stellt. Bei dieser ersten Begrüssungsseite kommt ausschliesslich HTML zum Einsatz. Den Code finden Sie im untenstehenden Kasten.




Neuregistrierung von Besuchern

Neue Besucher der Site haben sich mit Angaben wie Name und Adresse anzumelden. Dazu können Sie einen beliebigen Usernamen sowie ein Passwort wählen.



Wiederum handelt es sich um ein simples HTML-Formular, bei dem allerdings die Datenbank-Anbindung bereits ein erstes Mal zum Einsatz kommt. Da die vom Formular übermittelten Daten von der verarbeitenden Datei Login_confirm.cfm direkt in die Datenbank geschrieben werden, ist es nötig, die nächste freie Adressnummer abzufragen. Hierfür wird die höchste bereits gespeicherte Datenbank-Nummer ausgelesen, um den Wert 1 erhöht und dann mit den Formulardaten übermittelt. Alternativ liesse sich das Datenbank-Feld Adressnummer auch mit dem AutoWert-Attribut versehen, womit das im folgenden geschilderte Prozedere entfallen würde.




Bei der Arbeit mit ColdFusion wird zuerst mit einer Query-Anweisung eine Abfrage an die Datenbank geschickt, wobei die SQL-typische Syntax zum Einsatz kommt.



Die folgende Abfrage ermittelt die höchste in der Datenbank gespeicherte Adressnummer und trägt den Namen "adressnummerliste". Mit dem Parameter DATASOURCE wird der Link zur Datenbank hergestellt. Entsprechend der ODBC-Verbindung heisst er also "Registrierung".











<CFQUERY
NAME="adressnummerliste"
DATASOURCE="Registrierung"
Maxrows="1">
SELECT Adressnummer FROM Adressen
ORDER BY Adressnummer DESC
</CFQUERY>






Mit dem Zusatz MAXROWS wird bestimmt, dass nur ein einziger Datensatz zurückgeliefert wird. Welcher das ist, bestimmt die folgende SQL-Abfrage. In der SELECT-Anweisung wird das Feld Adressnummer aus der Tabelle Adressen gewählt. Mit der ORDER-BY- und der DESC-Anweisung wird dafür gesorgt, dass die Datensätze nach der Adressnummer in absteigender Reihenfolge ausgegeben werden. In Kombination mit dem angesprochenen MAXROWS-Befehl wird als Ergebnis die höchste Adressnummer ermittelt.



Für die Ausgabe der Query-Resultate wird der CFOUTPUT-Befehl verwendet, gefolgt vom Namen der betreffenden Abfrage. Die auszugebenden Feldnamen entsprechen jenen in der Datenbank und werden vom Routen-Zeichen eingerahmt.



Mit folgendem Code liesse sich die abgefragte Adressnummer ausgeben:











<CFOUTPUT
QUERY="adressnummerliste">
#adressnummer#
</CFOUTPUT>






Da für den neuen Anwender jetzt aber eine um den Wert 1 erhöhte Adressnummer übermittelt werden soll, wird mit dem CFSET-Tag eine neue Variable mit Namen "adressnummer2" initialisiert, der die um die Zahl 1 erhöhte Adressnummer aus der zuvor generierten Abfrage zugewiesen wird.











<CFOUTPUT
QUERY="adressnummerliste">
<CFSET adressnummer2 =
#adressnummer# + 1>
</CFOUTPUT>






Nun folgt das übliche Formular mit den eingangs genannten Feldern aus der Tabelle. Wichtig ist, dass die Namen der Formularfelder mit den Feldnamen aus der Datenbank übereinstimmen. Für das Tabellenfeld Adressnummer wird ein verstecktes Formularfeld mit der neu generierten Adressnummer verwendet.



Die kompletten Formulardaten werden schliesslich an die Datei loginneu_confirm.cfm übermittelt.




Die Auswertung der Benutzerdaten

Nachdem die Benutzerangaben via Formular übermittelt wurden, könnte man die Daten direkt mit dem CFINSERT-Befehl in die Datenbank einlesen.











<CFINSERT
DATASOURCE="Registrierung"
TABLENAME="adressen"
FORMFIELDS = "Adressnummer,
Vorname, Nachname, Strasse, PLZ,
Ort, EMail, Benutzer, Passwort">






Zuvor gilt es jedoch, einige Punkte bei den Formulareingaben zu überprüfen. Immerhin wurde der Anwender ja aufgefordert, sein Passwort zweimal einzugeben, um zu vermeiden, dass er sich vertippt hat. Weiter muss verhindert werden, dass Passwort und/oder Benutzerkennung bereits von einem anderen Anwender verwendet werden.



Trifft eines der Szenarien zu, muss verhindert werden, dass die Daten in die Datenbank eingelesen werden, und der Anwender muss zur erneuten Eingabe aufgefordert werden.
Hierfür kommt die IF-Bedingung zum Einsatz. Der folgende Code überprüft, ob die beiden Passworteingaben übereinstimmen und ob überhaupt ein Passwort übermittelt wurde:











<CFIF passwort is not passwort2
or passwort is "">
Passwort und/oder
Benutzer fehlen oder
Passwort wurde nicht
korrekt bestätigt!
Zurück zum
<a href="login_neu">
Registrierformular</a>
<CFELSE>






Der Code nach dem CFELSE-Tag wird erst dann ausgeführt, wenn die Bedingung erfüllt ist bzw. die beiden Passworte übereinstimmen und keine leeren Formularfelder übermittelt wurden. Falls dies nicht der Fall ist, wird der Besucher darauf aufmerksam gemacht und der Link zurück zum Registrierungsformular wird eingeblendet.



Im nächsten Schritt wird die Datenbank über die Abfrage "logincheck" nach den beiden Angaben Benutzer und Passwort durchforstet. Falls sich eine der beiden Eingaben bereits in der Datenbank findet, wird mindestens ein Datensatz zurückgegeben.



Um die Anzahl der Treffer festzustellen, kommt schlieslich die Funktion recordcount zum Einsatz. Falls dieser Wert grösser oder gleich 1 ist, wird der Besucher wiederum zum Registrierungsformular geleitet, da die Daten bereits in der Datenbank enthalten sind.











<CFQUERY Name="logincheck"
Datasource="registrierung"
MAXROWS="1">
SELECT * FROM adressen
where Benutzer =
'#Benutzer#' or
passwort = '#Passwort#'
ORDER BY Adressnummer DESC
</CFQUERY>

<CFIF
#logincheck.recordcount# gte 1>
Ihre Benutzerkennung
und/oder Ihr Passwort
sind bereits vergeben!
Zurück zum
<a href="login_neu">
Registrierformular</a>
<CFELSE>






Erst wenn beide IF-Bedingungen erfolgreich durchgespielt wurden, werden die Daten mit dem bereits weiter oben gezeigten Code in die Datenbank eingelesen.




Login für registrierte User

Anwender, die sich bereits registriert haben, können vom Start-Formular aus gleich ihre Kenndaten übermitteln, die von der Datei Login_confirm.cfm überprüft werden. Auch hier wird anhand einer IF-Abfrage zuerst einmal überprüft, ob beide Zeichenketten im Formular ausgefüllt und übergeben wurden.



Im nächsten Schritt wird dann anhand der Datenbank-Abfrage "adresscheck" der dazugehörende Datensatz gesucht. Mit der Bedingung <cfif #adresscheck.recordcount# is 1> wird festgestellt, ob die Daten in der Tabelle vorhanden sind, worauf sie angezeigt werden. Ist dem nicht so, wird der Anwender wiederum zum Registrierungsformular geleitet.





So geht's weiter

Mit dem vorgestellten Login wird allerdings nur gerade der Zugriff auf die Webseiten login_confirm.cfm bzw. loginneu_confirm.cfm geschützt.



Der nächste Schritt besteht nun darin, dem Anwender eine eindeutige Session-ID zuzuordnen, welche auf jeder Site im geschützten Bereich wiederum anhand der Datenbank überprüft wird. Dieses Prozedere werden wir in einem weiteren ColdFusion-Workshop erläutern, der auch eine einfache Warenkorb-Anwendung beinhaltet.



Artikel kommentieren
Kommentare werden vor der Freischaltung durch die Redaktion geprüft.

Anti-Spam-Frage: Vor wem mussten die sieben Geisslein aufpassen?
GOLD SPONSOREN
SPONSOREN & PARTNER