IPub\Permissions – jednoduché ACL pro nette aplikace

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
akadlec
Člen | 1326
+
+1
-

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
+
0
-

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.