Access Control List v CakePHP – 1. časť
publikované: od: Tibor PiňoJednou z najdôležitejších a zároveň jednou z najproblematickejších častí CakePHP je Access Control List. Tento miniseriál má za cieľ priniesť viac svetla do problematiky ACL.
Čo je Access Control List
Access Control List (ďalej len ACL) predstavuje spôsob, akým môžeme riadiť oprávnenia v rámci našej aplikácie jednoduchým a udržovateľným spôsobom. Nato, aby sme mohli požadovaného chovania dosiahnuť, potrebujeme dva hlavné prvky: prvým prvkom je objekt, ktorý žiada niečo, a druhým prvkom je objekt, ktorý je žiadaný. CakePHP používa pre tieto dva hlavné prvky názvy ARO (Access Control Object) a ACO (Access Request Object). ARO potom reprezentuje objekt, ktorý niečo žiada (väčšinou sa jedná o normálneho užívateľa aplikácie) a ACO predstavuje objekt, ktorý je žiadaný (napr. akcia controllera alebo webová služba). Vyššie napísané môžeme teda zhrnúť do vety: ACL je mechanizmus, ktorý rozhoduje o prístupe ARO k ACO, resp. rozhoduje o prístupe užívateľov alebo častí systému k dátam alebo iným častiam systému. Zároveň si však treba uvedomiť, že v prípae ACL sa nejedná o autentifikáciu, jedná sa o proces autorizácie, ktorý sa uskutočňuje až po vykonaní autentifikácie.
Ako ACL funguje
Aby sme si celý mechanizmus dokázali predstaviť, vytvoríme si jednoduchý reálny príklad. Predstavme si, že v našej aplikácii sa vyskytuje niekoľko typov užívateľov (ďalej len ARO): administrátor, redaktor a návštevník. Taktiež má náš systém svoje vlastnosti, ku ktorým budú pristupovať ARO. Náš systém je jednoduchý a obsahuje následujúce vlastnosti (ďalej len ACO): zobrazenie článku, pridanie článku a pridanie komentára. Jednotlivé ARO by sme mohli prehľadne zapísať následovne
- užívatelia
- administrátor
- Admin 1
- redaktor
- Redaktor 1
- návštevník
- User 1
- administrátor
CakePHP používa pre uloženie ARO stromovú štruktúru, ktorá umožňuje (napr. oproti tabuľke) zoskupiť užívateľov do jednotlivých skupín a riadiť tak prístup na úrovni týchto skupín, čo predstavuje väčšiu flexibilitu.
Zoznam ARO máme hotový, ešte musíme k nim priradiť jednotlivé ACO a tým vytvoríme kompletný ACL, ktorý bude riadiť prístup k našej aplikácii. Kompletný ACL bude vypadať následovne
- užívatelia
Deny: all- administrátor
Allow: zobrazenie článku, pridanie článku, pridanie komentára- Admin 1
- redaktor
Allow: zobrazenie článku, pridanie článku- Redaktor 1
- návštevník
Allow: zobrazenie článku, pridanie komentára- User 1
- administrátor
Ako môžeme vidieť, stromová štruktúra nám poskytuje vysokú flexibilitu. Ako užívateľ (bez bližšieho určenia či sa jedná o administrátora, redaktora alebo návštevníka) nemáme žiadne oprávnenie v našej aplikácii. Avšak ako redaktor môžeme zobrazovať a pridávať články, na druhej strane ako návštevník môžeme články len zobrazovať. Ako administrátor máme prístup ku všetkým vlastnostiam aplikácie. Vďaka spomínanej flexibilite stromovej štruktúry je veľmi jednoduché pridávať a odoberať skupiny alebo meniť oprávnenia pre jednotlivých užívateľov a skupiny.
Následne môžeme pomocou ACL zisťovať oprávnenia pre jednotlivé skupiny alebo jednotlivých užívateľov. Predstavme si situáciu, v ktorej by sme chceli zistiť, či redaktor Redaktor 1 má oprávnenie pridať článok. Najprv zistíme cestu stromom pre uzol Redaktor 1, cesta je nasledovná užívatelia → redaktor → Redaktor 1. Následne môžeme získať jeho oprávnenia, ktoré môžeme zobraziť pomocou tabuľky následovne
| ARO uzol | Oprávnenia | Výsledok |
|---|---|---|
| užívatelia | Deny all | nemá oprávnenie k pridaniu článku |
| redaktor | Allow „pridanie článku“ | prístup povolený |
| Redaktor 1 | Allow „pridanie článku“ | prístup povolený |
Predchádzajúce časti boli teoretické a mali za cieľ podrobne vysvetliť fungovanie ACL. Teraz si poďme ukázať, ako inicializovať ACL v CakePHP.
ACL v CakePHP
Inicializácia ACL spočíva vo vytvorení databázových tabuliek, ktoré sú potrebné pre správne fungovanie. Defaultne je ACL v CakePHP založený na databáze (možnosťou je taktiež používať ACL bez databázy, ale v našom článku budeme používať ACL v spolupráci s databázou). Pri vytváraní tabuliek máme dve možnosti, použitie konzoly cakephp alebo import sql priamo do databázy. Pre tých, ktorí sú zoznámení s cakephp konzolou, stačí spustiť pomocou konzoly príkaz
cake schema run create DbAcl
Výpis konzoly by mal vypadať následovne
---------------------------------------------------------------
Cake Schema Shell
---------------------------------------------------------------
The following tables will be dropped.
acos
aros
aros_acos
Are you sure you want to drop the tables? (y/n)
[n] > y
Dropping tables.
acos updated.
aros updated.
aros_acos updated.
The following tables will be created.
acos
aros
aros_acos
Are you sure you want to create the tables? (y/n)
[y] > y
Creating tables.
acos updated.
aros updated.
aros_acos updated.
End create.
Pre tých, ktorí s konzolou zatiaľ nepracovali, stačí importovať sql súbor uložený v app/config/sq/db_acl.sql do vašej databázy. Následne sa nám v databáze vytvoria tri tabuľky
acos – zoznam ACO
aros – zoznam ARO
aros_acos – zoznam oprávnení ARO k ACO
Po úvodnej inicializácii máme všetko pripravené pre začatie používania ACL v CakePHP. V následujúcich častiach seriálu sa pustíme do samotnej implementácie. Vytvoríme si kompletnú aplikáciu používajúcu ACL a taktiež si ukážeme, ako automaticky naplniť tabuľku ACOs podľa existujúcich controllerov v našej aplikácii.
Rád uvítam vaše nápady, pripomienky a skúsenosti s ACL v diskusii k článku.