English
version 2.2.1

  PClib - PHP component library



22. 01. 2009

Rychlokurz - autorizace

Třída auth slouží k autorizovanému přístupu na stránky. Uživatel se přihlásí svým jménem a heslem a je mu přidělena množina oprávnění. V aplikaci je možné otestovat, zda má uživatel konkrétní oprávnění.
Auth ověřuje uživatelské účty proti databázi mysql a používá dvě databázové tabulky: USERS - obsahuje seznam uživatelů, jejich hesel (uložených zašifrovaně), jejich roli, čas posledního přihlášení a další údaje k uživatelskému účtu.
Tabulka REGISTER obsahuje práva, které má každý uživatel nebo role přidělená.

Auth podporuje i HTTP autentifikaci, ale my si ukážeme přihlášení prostřednictvím php. K tomu slouží funkce $auth->login($jmeno, $heslo).
Jestliže přihlášení proběhlo v pořádku, vrátí tato funkce true a nastaví uživatelskou session. Pokud ne, vrátí false a v poli $auth->errors se nachází seznam chybových hlášení.
K zjištění jestli je uživatel přihlášený můžeme využít funkci $auth->islogged().
Údaje o přihlášeném uživateli získáme prostřednictvím $auth->getuser() - tato funkce vrátí záznam z tabulky USERS v asociativním poli.
Odhlášení provedeme jednoduše zavoláním funkce $auth->logout().

Předvedeme si přihlášení do aplikace ADMIN prostřednictvím jednoduchého formuláře loginform, který obsahuje pole username a password.
<br>
$auth = new auth('ADMIN');<br>
<
br>
$loginform = new form ('loginform.tpl');<br>
if (
$loginform->submitted) {<br>
  
extract($loginform->values);<br>
  
$auth->login($username$password);<br>
}<
br>
<
br>
if (
$auth->islogged()) header('Location: admin/hlavnistrana.php');<br>
else 
$loginform->out();<br>
 

čili: Nejprve inicializujeme objekt $auth. Pak inicializujeme přihlašovací formulář a otestujeme zda byl odeslán. Pokud byl, vyextrahujeme z něj políčka $username a $password a zavoláme funkci $auth->login().
Následně zjistíme jestli je uživatel přihlášen. Pokud ano, přesměrujeme ho na hlavní stránku admina, jestliže není, zobrazíme mu formulář pro přihlášení.

Jelikož svět je jak známo zlý a nepřátelský, mohlo by se stát, že se někdo pokusí obejít naše přihlášení tím, že otevře přímo stránku admin/hlavnistrana.php. Proto musíme mít autentifikaci i tam. Kdybychom se spokojili se zjištěním, že je nějaký libovolný uživatel přihlášen, stačilo by mít na začátku příkaz
<br>
if (!
$auth->islogged()) exit("Nejste přihlášen!");<br>
 

Ale lepší bude ověřit jestli má uživatel právo přístupu do admina. Toho dosáhneme zadáním příkazu:

$auth->testright('admin/vstup');

Tento příkaz zjistí, zda má uživatel právo admin/vstup a pokud ne, okamžitě ukončí program s chybovým hlášením.

Začátek skriptu hlavnistrana.php tedy bude vypadat takto:
<br>
$auth = new auth('ADMIN');<br>
$auth->testright('admin/vstup');<br>
$user $auth->getuser();<br>
<
br>
print 
"Vítejte ".$user['USERNAME']. " !";<br>
 

To, jestli má uživatel oprávnění x, můžeme zjistit funkcí $auth->hasright('x').
Předpokládejme, že jen někteří uživatelé mají v našem administrátoru přístup do menu vyplaty. Menu budeme vypisovat pomocí šablony menu.tpl.
<br>
$menu = new tpl('menu.tpl');<br>
if (
$auth->hasright('admin/vyplaty')) $menu->enable('vyplaty');<br>
$menu->out();<br>
 

Tím zabezpečíme, že položku vyplaty uvidí v menu jen uživatelé s právem admin/vyplaty.

Podívejme se teď, jakým způsobem se nastaví práva v databázových tabulkách.
řekněme, že máme tři uživatele

== Tabulka USERS ==

ID USERNAME ROLE_ID PASSW
--------------------------------------
1 sef NULL a1ff45ebdc2a..
2 zamestnanec NULL cf42a5dadd24..
3 programator NULL e34596ab6612..

Toto jsou jejich práva:

== Tabulka REGISTER ==

USER_ID ROLE_ID RKEY RVAL
----------------------------------------
1 NULL admin/vstup 1
1 NULL admin/vyplaty 1
2 NULL admin/vstup 1
3 NULL admin/* 1

Zaměstnanec má tedy přístup do admina, ale nevidí výplaty, zatímco šéf ano. Programátor má všechna práva admin. Všimněte si použitého wildcardu. Pokud má uživatel právo admin/* funkce $auth->hasright() vrátí true na jakýkoliv řetězec
admin/xyz.

Bylo by nepohodlné muset pro každého uživatele vždy vypisovat seznam jeho práv. Proto třída $auth podporuje známý koncept rolí. Vytvoříme prostě nějakou roli - například programátor nebo zaměstnanec a definujeme práva pro tuto roli. Pak jednoduše přidělíme roli konkrétním uživatelům, čímž získají všechna práva v roli obsažená.
Roli sef s ID=1 bychom např. vytvořili takto:

== Tabulka REGISTER ==

USER_ID ROLE_ID RKEY RVAL
----------------------------------------
NULL 1 admin/vstup 1
NULL 1 admin/vyplaty 1

Poté přidělíme roli šéf(1) všem šéfům:

== Tabulka USERS ==

ID USERNAME ROLE_ID PASSW
--------------------------------------
1 bill 1 a1ff45ebdc2a..
2 steve 1 cf42a5dadd24..
3 linus 1 e34596ab6612..

Jak vidíte, je to jednoduché. Podotýkám, že oba přístupy lze kombinovat. Můžeme mít tedy uživatele, který obdrží práva ze své role a k tomu jemu samotnému přidáme nějaké právo navíc, eventuálně zakážeme právo, které je jinak v roli obsaženo.

« zpět