Operace s oprávněním (Nette v2.0)

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

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
+
0
-

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 | 796
+
0
-

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…

mkoubik
Člen | 728
+
0
-

Nestačilo by v SecuredPresenter kontrolovat přihlášení a v AdminPresenter kontrolovat jestli má roli admin?