ACL nezrovalosti v dedičnosti

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

Zdravím,

1. Rád by som nastavil Resources tak, aby jeden dedil od druhého. Konkrétne mám App:Admin (ide o rozcestník v administrácii) a User:Admin (správa užívateľov). Nastavil som to nasledovne:

$permission->addResource('App:Admin');
$permission->addResource('User:Admin', 'App:Admin');

Role mám nasledúce:

$permission->addRole('guest');
$permission->addRole('user');
$permission->addRole('module-admin', 'user');
$permission->addRole('admin', 'module-admin');

A adminovi som pridal oprávnenie pre správu užívateľov (ku ktorej sa musí dostať cez rozcestník):

$permission->allow('admin', 'User:Admin');

Do rozcestníku sa ale nedostanem:

$this->getUser()->isAllowed('User:Admin'); // TRUE
$this->getUser()->isAllowed('App:Admin'); // FALSE

Nejako nerozumiem, prečo ak User:Admin dedí od App:Admin, tzn. (ak to preženiem) mal by mať všetky „vlastnosti“ App:Admin a potom ešte niečo „svoje“ extra, nie sú obe volania isAllowed TRUE.

Skúšal som to aj otočiť, no dostal som error, že Resource už existuje.


2. Je tu ešte jedna vec, ktorú neviem pochopiť, možno len napísať. Rád by som, aby admin nemohol mazať užívateľov (môže s nimi robiť, čo chce, okrem mazania):

$permission->allow('admin', 'User:Admin');
$this->getUser()->isAllowed('User:Admin'); // TRUE
$permission->deny('admin', 'User:Admin', 'delete');
$this->getUser()->isAllowed('User:Admin'); // FALSE

Zamietnutie jedného privilégia kompletne zakáže celý resource.

Vopred veľmi pekne ďakujem za rady a vysvetlenie.

David Matějka
Moderator | 6445
+
+4
-

Nejako nerozumiem, prečo ak User:Admin dedí od App:Admin, tzn. (ak to preženiem) mal by mať všetky “vlastnosti” App:Admin a potom ešte niečo “svoje” extra

Tak to preci je, User:Admin dedi od App:Admin a allow nastavujes na User:Admin, tedy na childu, nikoliv na parentu. Pokud bys allow nastavil pro App:Admin, tak by isAllowed vracelo TRUE pro oba resources.


a k 2, chovani je spravne, jelikoz nespecifikujes privilege, tak se predpoklada defaultni hodnota ALL, tedy se ptas, jestli muze delat vse s tim resource

Michal Vyšinský
Člen | 608
+
+1
-

Ty ale povoluješ roli admin resource ‚User:Admin‘ čili potomka, takže to neznamená, že rodič pro něj bude také povolený. Takže logicky musíš povolit pro roli ‚admin‘ předka a ne potomka:

$permission->allow('admin', 'App:Admin');
  • pak ti obě volání ‚isAllowed‘ vrátí TRUE.

Co se toho druhého týče, tak výchozí hodnota ‚pprivilege‘ pro ‚isAllowed‘ je ' self::ALL' to znamená, že vrátí TRUE jen tehdy, když máš povolené vše. Jinak vrátí FALSE. Budeš tedy muset specifikovat privilege.

@DavidMatějka byl rychlejší :)

Editoval Michal Vyšinský (30. 6. 2015 15:56)