Autentizace a sessions

Přihlášení uživatele v phpBASE

Framework definuje dvě globální session proměnné $UID a $PWD. U nepřihlášeného uživatele jsou prázdné. V okamžiku úspěšného přilogování se do nich uloží UID a zašifrované heslo přihlášeného uživatele. Při každém dalším požadavku v rámci této session pak podle nich systém automaticky kontroluje platnost takového přihlášení.

phpBASE používá formulářový typ autentizace. Stánka s přihlašovacím formulářem by měla být nastavena v systému jako logovací stránka. Pak ji totiž Controller automaticky zobrazí vždy, když dojde k vynucenému přihlášení, tedy když se nepřihlášený uživatel pokusí otevřít jemu nepřístupnou stránku či skript. Pro přihlášení již registrovaného uživatele slouží funkce auth_login. Zjednodušený skript zpracovávající login formulář (s formulářovými vstupními poli login a password) vypadá třeba takto:

<?php
$login 
$_POST['login'];
$password $_POST['password'];

if (
auth_login($loginmd5($password))) {
    
redirect('/main/index');
} else {
    
direct();
}
?>

Při neúspěšném pokusu o přihlášení se zobrazí znovu login stránka včetně vypsání důvodu selhání přihlašovacího procesu. Naopak v případě úspěchu nastaví funkce auth_login zmíněné globální session proměnné $UID a $PWD a zajistí zapsání timestampu do databázového záznamu uživatele. Nakonec se zpracování požadavku přesměruje na stránku /main/index.

Přihlášení uživatele v aktuální session trvá tak dlouho, dokud nedojde k explicitnímu či automatickému odhlášení. Explicitní odhlášení se provádí na základě příslušného požadavku uživatele a slouží k němu funkce auth_logout. Automatické odhlášení iniciuje Controller v okamžiku, kdy detekuje potenciální ohrožení zabezpečení – viz následující podkapitolu.

Sessions a platnost přihlášení v phpBASE

Framework phpBASE využívá standardní podporu sessions poskytovanou interpreterem jazyka PHP. Ten obstarává téměř vše, od vygenerování session tokenu a jeho zaslání klientovi až po spárování jednotlivých požadavků, obnovu a ukládání session proměnných či zrušení timeoutované session. I přesto je ale nutné zajistit některé dodatečné kontroly, zejména pokud pod danou session pracuje přihlášený uživatel.

Ve frameworku se nevytváří nová session po každém přihlášení uživatele. Jedna session zde existuje po celou dobu existence okna prohlížeče (samozřejmě s výjimkou jejího timeoutu), od prvního dotazu až po zavření okna. Framework zajistí, že session proměnné určené jen pro aktuálního uživatele se již nebudou obnovovat po jeho odhlášení či přihlášení uživatele jiného (viz také kapitolu Supersession proměnné).

Přihlášení uživatele v aktuální session je vázáno na jednu IP adresu klienta. V případě, že někdo převezme jeho session token a pokusí se o přístup z jiné IP adresy, bude jeho požadavek odmítnut. Tuto kontrolu samo PHP standardně neprovádí, neboť se obecně nemusí vždy hodit. Například je omezující pro uživatele přistupující z privátních sítí, jejichž vnější směrovače průběžně při každém dalším požadavku cyklicky mění několik IP adres.

Framework má vlastní timeout přihlášení uživatele. Sleduje se paralelně s PHPčkovským timeoutem celé session, ale je kratší. Neboli po jeho vypršení je uživatel se všemi důsledky automaticky odhlášen, ale session samotná ještě nějakou dobu dále existuje. To umožňuje zajistit některé další funkce, například obnovu ztraceného požadavku, která je popsaná v následující subkapitole.

Controller může uživatele automaticky odhlásit i v dalších případech. Při každém požadavku kontroluje platnost hodnot v globálních session proměnných $UID a $PWD oproti záznamům v databázi. Neodpovídají-li si navzájem, provede okamžité odhlášení uživatele v aktuální session. Stejně postupuje, jestliže v průběhu přihlášení dojde k expiraci účtu či k jeho zablokování administrátorem.