Aufbauend auf meinen Post “Benutzerlogin mit verschlüsseltem Passwort” stelle ich nun eine PHP-Klasse vor, welche den Login programmiertechnisch abfackelt.
Es wird also wieder gebraucht:
- Webserver mit PHP (bevorzugt PHP 5) und mySQL
- Eine mySQL-Datenbank für die Logindaten
- Eine mySQL-Klasse (dient hier nur als Beispiel)
Die mySQL-Tabelle:
Diese hat nun 4 Attribute. ID, name, passwort und sessionid.
1 2 3 4 5 6 7 | CREATE TABLE `login` ( `id` int(2) NOT NULL auto_increment, `name` varchar(255) collate utf8_unicode_ci NOT NULL, `passwort` varchar(255) collate utf8_unicode_ci NOT NULL, `sessionid` varchar(254) collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Logindaten' |
Die PHP-Klasse:
Nun kommt die eigentliche PHP-Klasse. Diese kann – so wie sie hier vorgestellt wird – keine Nutzer anlegen oder löschen. Es ist eine reine Loginprüfung. Das heißt, mit dieser Klasse kann man Nutzer einloggen, ausloggen und prüfen ob Nutzer eingeloggt sind, oder nicht.
Dazu gibt es drei verschiedene Klassenmethoden.
1 2 3 4 5 6 | // Einloggen if ($obj_checkLogin->login('username', 'passwort', session_id())) { // Eingeloggt } else { // Nicht eingeloggt } |
1 2 |
1 2 3 4 5 6 | // Loginstatus prüfen if ($obj_checkLogin->check_access(session_id())) { // Eingeloggt } else { // Nicht eingeloggt } |
Wie man erkennen kann, wird nur der ersten Methode, also dem Einloggen der Nutzername und das Passwort zusätzlich zur Session-ID mit auf den Weg gegeben. Bei den Methoden zum Ausloggen und Prüfen reicht die Session-ID vollkommen aus. Die Klasse enthält außerdem noch ein Array zur Konfiguration der Datenbankfelder, falls diese anders heißen als in diesem Beispiel.
1 2 3 4 5 6 | private $array_config = array( 'usertabelle' => 'login', 'namefield' => 'email', 'passwordfield' => 'passwort', 'sessionfield' => 'sessionid' ); |
Die hier definierten Schlüssel sollten selbstredend sein, also erspare ich mir eine weitere Erklärung.
Aufgebaut ist die Loginklasse wie jede andere auch, beginnend mit der Klassendefinition.
1 2 3 4 5 6 7 8 9 10 11 12 13 | class loginCheck { public function login($user, $pass, $sessid) { ........ } public function logout($sessid) { ........ } public function check_access($sessid) { ........ } } |
Somit wird die Klasse innerhalb des PHP-Scriptes wie folgt aufgerufen:
1 | $obj_checkLogin = new loginCheck(); |
Die Variable $obj_checkLogin ist das Klassenobjekt, mit dem die Methoden aufgerufen werden. Diese sehen wie folgt aus:
Die Methode login(); prüft an Hand der übergebenen Daten, ob es den Nutzer in der Datenbank gibt, und ob die Kombination aus Nutzernamen und Passwort stimmt. Das Passwort wird hierbei natürlich in MD5 in der Datenbank hinterlegt sein.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | /** * Userdaten prüfen und User einloggen * * @param string $user Username * @param string $pass Userpasswort (hier noch kein MD5-Hash) * @param string $sessid Session-ID * @return bool */ public function login($user, $pass, $sessid) { $this->user = $user; $this->pass = $pass; $this->sessid = $sessid; $obj_sql = new mySQL(DB_Webseite); $this->sql = sprintf("SELECT * FROM %s WHERE %s = '%s';", $this->array_config['usertabelle'], $this->array_config['namefield'], $this->user); $this->userdata = $obj_sql->select($this->sql, &$var_iAnzahl); if ($var_iAnzahl == '1') { if ($this->userdata['0']->passwort == md5($this->pass)) { $this->sql = sprintf("UPDATE %s SET %s = '%s' WHERE id = '%s';", $this->array_config['usertabelle'], $this->array_config['sessionfield'], $this->sessid, $this->userdata['0']->id); $obj_sql->query($this->sql); unset($obj_sql); return true; } else { unset($obj_sql); return false; } // ENDE if ($this->userdata['0']->password == md5($this->pass)) } else { unset($obj_sql); return false; } // ENDE if ($var_iAnzahl == '1') } // ENDE public function login($user, $pass, $sessid) |
Die Methode logout(); ermittelt an Hand der übergebenen Session-ID den Nutz in der Datenbank für den diese Session-ID hinterlegt ist und löscht diese ID in der Datenbank. Damit ist der Nutzer als “ausgeloggt” markiert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /** * User ausloggen * * @param string $sessid Session-ID * @return bool */ public function logout($sessid) { $this->sessid = $sessid; $obj_sql = new mySQL(DB_Webseite); $this->sql = sprintf("SELECT * FROM %s WHERE %s = '%s';", $this->array_config['usertabelle'], $this->array_config['sessionfield'], $this->sessid); $obj_sql->select($this->sql, &$var_iAnzahl); if ($var_iAnzahl == '1') { $this->sql = sprintf("UPDATE %s SET %s = '' WHERE %s = '%s';", $this->array_config['usertabelle'], $this->array_config['sessionfield'], $this->array_config['sessionfield'], $this->sessid); $obj_sql->query($this->sql); unset($obj_sql); return true; } else { unset($obj_sql); return false; } // ENDE if ($var_iAnzahl == '1') } // ENDE public function logout($sessid) |
Die Methode check_access(); macht nichts anderes, als an Hand der Session-ID zu prüfen, oder der Nutzer eingeloggt ist. Dazu wird die Session-ID in der Nutzertabelle der Datenbank gesucht. Wird diese gefunden, ist der Nutzer eingeloggt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /** * Zugriff des Users prüfen * * @param string $sessid Session-ID * @return bool */ public function check_access($sessid) { $this->sessid = $sessid; $obj_sql = new mySQL(DB_Webseite); $this->sql = sprintf("SELECT id FROM %s WHERE sessionid = '%s';", $this->array_config['usertabelle'], $this->sessid); $obj_sql->select($this->sql, &$var_iAnzahl); if ($var_iAnzahl == '1') { return true; } else { unset($obj_sql); return false; } // ENDE if ($var_iAnzahl == '1') } // ENDE public function check_access($sessid) |
Damit das alles funktioniert, muss natürlich auch eine Session gestartet sein.
1 |



