Operace s oprávněním (Nette v2.0)
- Prochy
- Člen | 91
Dobré odpoledne,
mám takovouto strukturu presenteru, a v SecuredPresenteru zjišťuji jestli je daný uživatel přihláše a jakou má roli, a potřeboval bych, když bude mít roli „admin“, tak aby mohl přistoupit na oba presentery a když bude mít roli „client“, tak aby mohl přistoupit pouze na ClientPresenter, ale nějak nevim jak na to. Problém je, že když dám v SecuredPresenteru podmínku role==client redirect ClientPresenter, tak se mi to samozřejmě zacyklí, ale bohužel nemůžu přijít na to, jak to vyřešit. Nebo jestli je takovéto řešení struktury špatné a lze to vyřešit líp, tak bych rád věděl jak na to.
Děkuji za případné rady a nápady.
- David Ďurika
- Člen | 328
poriadne si nastuduj https://doc.nette.org/…thentication chybaju ti zaklady… potom sa vrat, neber to v zlom :) len nema zmysel to pisat sem ked je to uz raz napisane…
- uestla
- Backer | 799
Nejrychlejším řešením je před přesměrováním
na ClientPresenter
kontrolovat, jestli už
na něm nejsem ($this->name === 'Client'
).
Robustnější by ale bylo vytvořil si
jednoduché ACL a kontrolovat práva přístupu
pomocí něj.
Nástřel (v dokumentaci zde):
$acl = new Permission;
$acl->addRole('client');
$acl->addRole('admin', 'client');
$acl->addResource('Client');
$acl->addResource('Admin');
$acl->allow('client', 'Client');
$acl->allow('admin', 'Admin');
$container->addService('authorizator', $acl);
Tím pádem se stává SecuredPresenter
zbytečným
a ty můžeš kontrolu přesunout rovnou do BasePresenteru
,
např. nějak následovně:
protected function startup()
{
parent::startup();
if (!$this->user->isAllowed($this->name, $this->action)) {
$this->flashMessage('Permission denied.', 'warning');
$this->redirect('Client:');
}
}
Psáno na koleně, snad bude fungovat…