Authorizator pomocí Permission – právo přístupu ke zdroji o konkrétním ID

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

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)