IPub\Permissions – jednoduché ACL pro nette aplikace
- akadlec
- Člen | 1326
Dlouho jsem řešil problém s ACLkem ve své appce. Jednu dobu tady byl doplněk dynamické ACL, docela se mě líbil, ale nějak vyšuměl a zmizel. Tak jsem se tento stav rozhodl řešit po svém. V appce používám jak autorizace pomocí anotací tak i klasicky v kódu $user->isAllowed(…). Taky jsem potřeboval vyřešit nějaký management rolí a práv a z toho všeho vznikla extensions IPub\Permissions
Co umí?
Rozšiřuje standardní nettí Nette\Security\Permission a přidává další funkce. Stačí ji předat role a sadu permissions. Vše se pak spáruje, nastaví se přístupy a v appce pak můžete využívat autorizace.
Co od vás vyžaduje?
Musí se jí předat model s pomocí kterého získá vámi definované role. Každá role musí implementovat interface a musí mít k dispozici základní metody, mimojiné i metodu vracející zda daná role má přístup k dané kombinaci resource:privilege. Musíte ji také samozřejmě předat jednotlivé kombinace permissions tedy resource:privilege na základě kterých pak dokáže určit zda uživatel k tomu má právo či nikoliv.
Jak se ověřuje?
Klasicky pomocí anotací v presenterech či jejich akcích:
/**
* @Secured
* @Secured\User(loggedIn)
* @Secured\Resource(NameOfResource)
* @Secured\Privilege(NameOfPrivilege)
* @Secured\Permission(NameOfResource: NameOfPrivilege)
* @Secured\Role(NameOfRole)
*/
class ArticlesPresenter extends \Nette\Application\UI\Presenter
{
}
Anotace @Secured je nutná, bez ní bude autorizace přeskočena, další uvedené pak dávají moc definovat přístup. Může se použít jedna či libovolná kombinace.
Pokud chceme udělat ověření v nějaké podmínce, třeba modelu, a máme k dispozici uživatele tak se to řeší klasicky:
$user->isAllowed('resource', 'privilege');
Jak v šablonách?
Pokud někdo potřebuje dělat ověření i na úrovní šablon tak jsou k dispozici i nějaká ta makra.
Jedno z nich je {ifAllowed …}…{/ifAllowed}.
Parametry tohoto makra jsou obdobné jako u anotace tedy např.:
<div class="some class">
<p>
This text is for everyone....
</p>
{ifAllowed resource => 'system', privilege => 'manage user permissions'}
<p>
But this one is only for special persons....
</p>
{/ifAllowed}
</div>
či jako n:makro
<div class="some class">
<p>
This text is for everyone....
</p>
<p n:ifAllowed resource => 'system', privilege => 'manage user permissions'>
But this one is only for special persons....
</p>
</div>
Co dál?
Pokud někoho napadne nějaká funkcionalita co by měla být řešena na úrovni této ext. tak klidně dát vědět, udělat pull atd. Případně feedback o tom jak to funguje bude taky fajn ;)
Editoval akadlec (15. 10. 2014 9:36)
- akadlec
- Člen | 1326
Takže protože mi pár lidí psalo že má problém to nasadit, zda není nějaký sandbox…tak sandbox zatím není, ale konečně jsem se dokopal k tomu udělat nějaké testy, tak snad z nich bude aspoň trochu patrné jak s tím pracovat atd.