Jednoduché acl ve spolupráci s vlastníkem příspěvků
- Pinqui
- Člen | 19
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
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
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
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áš ;)