Authorizator pomocí Permission – právo přístupu ke zdroji o konkrétním ID
- thm
- Člen | 147
Zdravím vás,
řeším tady problém, jakým nejlepším způsobem vyřešit problém
s autorizací, kdy nemají všichni uživatelé možnost editovat článek.
Každý uživatel má v DB uložené ID článků, které editovat může.
$authorizator = new Nette\Security\Permission;
$authorizator->addRole('user');
$authorizator->addResource('article');
$authorizator->allow('user', 'article', 'edit'); //Takto mohou všichni editovat všechny články
Měl jsem řešení, ale takové podle mě hnusné (takhle to tam nemám, popisuju jenom princip):
//Každý článek mám jako samostatný zdroj
foreach($context->table('article') as $article) $authorizator->addResource('article-'.$article->id);
//Potom nastavím práva z DB pro konkrétního uživatele
foreach($context->table('user_permission')->where('user',$user->id) as $permission)
$authorizator->allow($user->role, $permission->resource, $permission->privilege)
//A pak v presenteru (případně v šabloně, pokud chci něco skrýt) kontroluju
public function action edit($articleId){
if(!$user->isAllowed('article-'.$articleId,'edit')) //flashmessage, redirect...
}
Ale když si pak představím, že v aplikaci budou články, stránky, diskuze, galerie, ankety atd.. Tak těch dotazů na DB bude asi hodně. Proto si myslím, že tudy cesta nevede.
Na fóru jsem vyčetl, že existoval čtvrtý parametr u IAuthorizator::isAllowed() a sice IPermissionAssertion, kde bych si asi toto mohl doladit(?). Tento parametr je od 2.0 nahrazen callbackem
Potřeboval bych ale konkrétně poradit jak na to? Nebo jaké mám
možnosti.
Díky
Editoval thm (25. 6. 2014 14:26)