Jednoduché acl ve spolupráci s vlastníkem příspěvků

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

Zdravím, chtěl bych se zeptat, jak implementovat jednoduché acl.

Jde mi o to, že chci mít pouze 3 role (guest, member, admin)
tyto role budou mít dejme tomu nějaké základní resource třeba k diskusi a privilegs (view, edit, delete)

zajímalo by mě, jak to napsat tak, aby třeba to delete a edit bylo přístupné vždy jen pro vlastníka příspěvku. Koukal jsem ně nějaké sepsané tutoriály, jsou ale staré a dvakrát jsem jich nepochopil.

Děkuji za pomoc

pekelnik
Člen | 462
+
0
-

Takovou kontrolu můžeš provést uvedením callbacku $assertion jako čtvrtého parametru při vytváření pravidla.

Viz: https://api.nette.org/…ion.php.html#417

Při kontrole oprávnění – tedy vlastním procesu autorizace – je tento callback zavolán a jsou mu předány tyto čtyři parametry:

  • vlastní objekt $permission
  • kontrolovaná role $role
  • kontrolovaný zdroj $resource
  • kontrolovaný typ oprávnění $privilege

Tedy vše podstatné pro rozhodnutí zda přístup udělit či nikoliv.

Viz: https://api.nette.org/…ion.php.html#757

Příklad:

<?php

use Nette\Security\Permission;

$acl = new Permission();
$acl->addRole('member');
$acl->addResource('comment');
$acl->addPrivilege('edit');
$acl->allow('member', 'comment', 'edit', function($permission, $role, $resource, $privilege) {
	return $permission->queriedRole->id === $permission->queriedResource->ownerId;
});

?>

Další informace: https://forum.nette.org/…i-permission

Informace na té stránce je trochu staršího data – v té době ještě $assertion byl objekt implementující rozhraní IPermissionAssertion, dnes je to callback.

Pinqui
Člen | 19
+
0
-

no a když mám pak funkci:

public function editAction($id){

	if($this->user->isAllowed(......){
		......
	}
}

Tak jak do ní dostanu ty dvě id tak, aby se to provedlo? když normálně tam posílám $this->user->isAllowed($this->name, $this->action); ??

Asi to bude primitivní, ale nějako mi to nedochází. Díky

pekelnik
Člen | 462
+
0
-

Dle tvého původního dotazu předpokládám, že chceš kontrolovat oprávnění pro nějaký komentář:

<?php

class CommentPresenter extends BasePresenter
{
	public function actionDelete($id)
	{
		$comment = new Comment($id);
		if ($this->user->isAllowed($comment, $this->action)) {
			$comment->markAsDeleted();
		}
	}
}

?>

Předpokládá se, že $comment implementuje rozhraní IResource. Pokud tam pošleš jméno presenteru, tak z něj samozřejmě $ownerId nezískáš ;)

Pinqui
Člen | 19
+
0
-

a aby fungovalo $permission->queriedRole->id, tak musím při authentikaci do identity místo $db->role hodit array(new Member($db->id)) že…