Nastavení práv a jejich kontrola – 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
-

Zdravim, potřeboval bych trochu poradit s nastavením práv v Nette. Přihlášení mám vyřešený a pak práva nastavim následně:

protected $acl;
protected function startup() {
    parent::startup();
    $this->acl=new Nette\Security\Permission();
    $this->acl->addRole('therapist');
    $this->acl->addRole('admin','therapist');
    $this->acl->addResource('settingsPage');
    $this->acl->allow('admin','settingsPage','view');
    }

Potom dejme tomu na stránce v presentru kde se pak používá ten settingsPage mám:

protected function startup(){
       parent::startup();
       $role=($this->getUser()->getRoles());
       if(!$this->acl->isAllowed($role,'admin','view')){
          $this->redirect('Homepage:') ;}
    }

Ale nevim, jak správně dosadit do té podmínky tu roli právě přihlášeného uživatele. A pokud by byla hodnota FALSE, tak přesměrovat pryč. Nebo jestli bych ty práva měl nastavovat jinde? Zrovna v tomhle si nejsem tak jistej, tak bych potřeboval poradit.
Díky za odpovědi

bojovyletoun
Člen | 667
+
0
-

Tohle nemůže fungovat. Do proměnná $role přiřazuješ pole Nette\Security\User::getRoles(). A Metoda Nette\Security\Permission::isAllowed() přijímá v 1. arg jen string/null/IRole.
Takže správně je použív Nette\Security\User::isAllowed() – on už si role projde.

llook
Člen | 407
+
0
-

Implementuj si IAuthorizator a regni ho jako službu:

class MyAuthorizator implements Nette\Security\IAuthorizator

    /**
     * @var Nette\Security\Permission
     */
    private $acl;

    public function __construct()
    {
        $this->acl = new Nette\Security\Permission();
        $this->acl->addRole('therapist');
        $this->acl->addRole('admin','therapist');
        $this->acl->addResource('settingsPage');
        $this->acl->allow('admin','settingsPage','view');
    }

    function isAllowed($role, $resource, $privilege)
    {
        return $this->acl->isAllowed($role, $resource, $privilege);
    }

}

config.neon:

services:
	authorizator: MyAuthorizator

A potom používej $user->isAllowed($resource, $action). User si ten autorizátor získá ze service locatoru přes getByType (viz) a zavolá na něm isAllowed postupně pro všechny svoje role (viz).

Prochy
Člen | 91
+
0
-

Díky, nečekal sem, že to je až tak lehký. :-)