Funktionalität ‚Angemeldet bleiben‘ im Scriptcase Security-Modul nachrüsten
Mit Scriptcase kann man relativ einfach ein übergreifendes Sicherheits-System implementieren.
Dazu ruft man im Menü ‚Tools > Security‘ auf und folgt den Dialogen.
Dabei werden Tabellen und Applikationen für das Anmelden und die Verwaltung von Benutzern, Gruppen etc. automatisch erzeugt.
Allerdings fehlt in diesem Modul die heute recht gebräuchliche Funktionalität, mit der sich Benutzer, die auf eigenen Computern arbeiten, die Anmeldung für einen gewissen Zeitraum automatisieren können.
Hier eine Möglichkeit eine solche ‚Remember-Me‘ Funktion nachzurüsten.
Es werden dabei Cookies genutzt, die auf dem Computer des Benutzers gespeichert werden und beim nächsten Aufruf des ‚app_Login‘ die Anmeldung automatisch vornehmen.
1. Dazu brauchen wir ein zusätzliches Feld in der Tabelle sec_users:
Feldname: remember_me
Typ: Text
Standardwert: “ (leer), kein NULL erlaubt
2. Ein neues Feld in der Applikation app_Login, die beim Erzeugen des Sicherheits-Systems erstellt wurde:
Wir erstellen ein Feld vom Typ Checkbox mit dem Namen remember_me und tragen in den Lookup Setting manuell nur einen Wert ein. Wichtig ist hier der Wert 1; als Beschriftung könnte deutsch z.B. stehen: Anmeldung merken
Das Feld wird entsprechend positioniert:
3. Funktionalität in Events on_Validate und on_Validate_Success in eigene php-Methoden (Funktionen) auslagern
Da der Code der Ereignise on_Validate und on_Validate_Success in Zukunft zweimal benötigt wird, werden sie in neue PHP-Methoden ausgelagert.
In den Ereignis-Einstellungen verbleiben nur noch die Funktionsaufrufe:
4. PHP-Code in der neuen php-Methode validate_success_function() ergänzen
Vor der Weiterleitung am Ende des Codes sc_redir(‚…‘) wird der folgende Code eingefügt:
// REMEMBER ME - Wenn ausgewählt, das cookie entsprechend setzen if ({remember_me}==TRUE) { $cookiehash = md5(sha1([usr_login] . $_SERVER['REMOTE_ADDR'])); setcookie("esdcloud_user",$cookiehash,time()+3600*24*30,'/','.'.$_SERVER['SERVER_NAME']); } else { $cookiehash = ''; } sc_exec_sql("UPDATE `sec_users` SET `remember_me`='" . $cookiehash . "' WHERE `login`='" . [usr_login] . "'");
5. Es wird eine neue php-Methode eingefügt:
Name: check_cookie_login
$t_usr_login = $_COOKIE['esdcloud_user']; if (!empty($t_usr_login)) { $sql_remember_me = "SELECT remember_me,pswd,login FROM `sec_users` WHERE `remember_me`='" . $t_usr_login. "'"; sc_select(my_data, $sql_remember_me); if ({my_data} === false) { die( "Access error. Message =". {my_data_erro}); } else { if (!$my_data->EOF) { $t_cookie_hash = $my_data->fields['remember_me']; $t_pswd = $my_data->fields['pswd']; $t_login = $my_data->fields['login']; } else { $t_cookie_hash = 'ERROR'; $t_pswd = ''; $t_login = ''; }
$my_data->Close(); }
if ($t_cookie_hash==$_COOKIE['esdcloud_user']) { {login} = $t_login; {pswd} = $t_pswd; // reset expiry date setcookie("esdcloud_user",$t_cookie_hash,time()+3600*24*30,'/','.'.$_SERVER['SERVER_NAME']); return TRUE; } else { // Kein schon gemerktes Login, oder falsch {login} = ''; {pswd} = ''; return FALSE; } } else { // Kein schon gemerktes Login, oder falsch {login} = ''; {pswd} = ''; return FALSE; }
6. Im Code des Ereignisses einfügen:
Beim Laden des app_Login muß geprüft werden, ob auf dem Computer des Anwender ein entsprechendes Cookie gesetzt ist und ob es gültig ist.
Dazu wird am Ende der Code ergänzt:
if (check_cookie_login()) { // echo "Login via cookie"; validate_function(); validate_success_function(); }
7. Neue Application zum Abmelden (und damit Zurücksetzen der Cookie-Berechtigung):
Statt dem normalen Menüpunkt zum Beenden (mit der Funktionalität ‚Leave‘ wird eine Application vom Typ control erstellt, die den Eintrag für das Cookie in der Tabelle sec_users entfernt.
Damit wird in unserer Anwendung das Cookie als ungültig gesetzt und der Anwender muß sich beim nächsten Mal wieder neu anmelden.
Eigentlich benötigt diese Application nur den folgenden Code, der auch in jeder anderen, bereits vorhandenen Routine zum Abmelden eingefügt werden kann:
sc_exec_sql("UPDATE `sec_users` SET `remember_me`='' WHERE `login`='" . [usr_login] . "'"); sc_redir(app_Login, usr_login='' , "_parent");
8. Für Administratoren – Zurücksetzen ALLER vorhanden ‚gemerkten‘ Anwender-Logins:
Dieser Code kann in einer eigenen Control-Application oder einer allgemeinen ‚Reset‘-Funktion eingefügt werden.
sc_exec_sql("UPDATE `sec_users` SET `remember_me`=''"); die('Die Cookie-Daten wurden zurückgesetzt.');
Tipp: Ich habe deine neue, zusätzliche Site für PHP & Scriptcase Tipps fertige Lösungen in open source hier klicken |