ACL – ukazkový příklad, který nefunguje dle očekávání
- Ot@s
- Backer | 476
Mám následující modifikaci sandboxu (8.12.2011 a starší).
Acl.php
class Acl extends \Nette\Security\Permission {
public function __construct() {
$this->addRole("host");
$this->addRole("revisor", array( 0 => 'host'));
$this->addRole("user", array( 0 => 'host'));
$this->addRole("manager", array( 0 => 'host'));
$this->addRole("configurator", array( 0 => 'host'));
$this->addRole("admin", array( 0 => 'revisor', 1 => 'manager', 2 => 'user', 3 => 'configurator') );
$this->addResource("HomepagePresenter");
$this->addResource("HomepagePresenter::actionDefault","HomepagePresenter");
$this->addResource("HomepagePresenter::bookingFormSubmitted","HomepagePresenter");
$this->allow("host","HomepagePresenter","read");
$this->allow("manager","HomepagePresenter::actionDefault","edit");
$this->allow("user","HomepagePresenter::actionDefault","edit");
$this->allow("host","HomepagePresenter::actionDefault","read");
$this->allow("host","HomepagePresenter::bookingFormSubmitted","read");
//$this->allow(null,'HomepagePresenter::actionDefault','read');
}
}
Jednoduchý Authenticator.php
class Authenticator extends Nette\Object implements Nette\Security\IAuthenticator
{
public function authenticate(array $credentials)
{
return new Nette\Security\Identity(1, array('manager'), array('name'=>'tester'));
}
}
Jednoduchý Model.php
class Model extends Nette\Object
{
public function createAuthenticatorService()
{
return new Authenticator();
}
public function createAuthorizatorService()
{
return new Acl();
}
}
Příslušnou inicializaci v config.neon (fragment):
model:
class: Model
authenticator:
factory: @model::createAuthenticatorService
authorizator:
factory: @model::createAuthorizatorService
Nakonec to, co mě nejvíce zajímá, použití v presenteru:
public function renderDefault()
{
// se prihlasim
if (!$this->user->isLoggedIn()) $this->user->login('a', 'b');
// otestuju ACL
if ($this->user->isAllowed('HomepagePresenter::actionDefault')) {
die('ano');
} else {
die('ne');
}
}
K memu velkému údivu mi skript vrací NE, ač bych na základě
definovaných pravidel čekal ANO.
Pokud v Acl.php odkomentujete řádek
$this->allow(null,'HomepagePresenter::actionDefault','read');
,
tak to se dočkám kýženého ANO. Jenže tento řádek přece nedává
v praxi smysl (neodpovídá tomu, co je v tutoriálu).
Prosím o vysvětlení, kde je problém. Na základě toho, co jsem vykoumal
z Permission.php
, tak bych to spíše viděl na chybu (resp.
nedotažení metody getRules
). Otázka tedy zní, u koho je ta
chyba, co dělat jinak? Díky za nasměrování.
- bojovyletoun
- Člen | 667
Bohužel se mi smazal text, tak jen v krátkosti tipy:
- inspirace:můj příspěvek , v něm další vlákno – ve zkratce, není lepší si přepast metody checkrequirments v presenteru (OR controlu), pak stačí jenom připsat anotaci k presenteru (OR metodě) , příklad jde upravit, podle toho, zda chceš jen přihlášení nebo i roli.
- můžeš použít u metody allow i pole pro více rolí, zdrojů i priv.
- Třída model je dle mě je „rozbíječ“ DI. přece jde v configu
zapsat
authorizator: class: Acl
- K příkladu
Podle mě je to takto v pořádku. Ty v ACL definuješ, že user (manager), může read a edit. Pak se ptáš jestli user může vše. Zkus si na to odpovědět. V druhém případě se ptáš, zda user může read, což může.
- řešení: buď se ptát na konkrétní privileg
$user->isAllowed('HomepagePresenter::actionDefault','edit');
a nebo definovat roli manager takto:$p->allow("manager", "HomepagePresenter::actionDefault");
pro ostatní mám násl. otážku: je lepší při přihlášení dávat userovi víc rolí a nepoužívat dědičnost A NEBO dávat userovi vždy jednu roli a dědit role c Perm.?
Editoval bojovyletoun (12. 12. 2011 15:25)
- h4kuna
- Backer | 740
bojovyletoun napsal(a):
pro ostatní mám násl. otážku: je lepší při přihlášení dávat userovi víc rolí a nepoužívat dědičnost A NEBO dávat userovi vždy jednu roli a dědit role c Perm.?
K tomuhle bych měl zase já otázku.
Mám tu nejasnost v právech https://doc.nette.org/…thentication#…
je tu ukázka registered dědí od guest a od registered dědí administrator.
Když se přihlásím jako administrátor a zavolám isInRole(‚registered‘)
vratí FALSE, čekal bych TRUE. Tím by byla odpověď na tvou
otázku… (nejde to). Ale když dědí resource, tak by mohl dědit
i roli.
Jak třeba řešíte práva pro zobrazení formuláře který je umístěný v komponentě a podle toho v jaké je přihlášený roli tak se mu ukáže nebo neukáže? Ale aby se ukazál administratorovi tak musím vypsat obě role v podmínce isInRole. Což by měla stačit ta nejnižší (‚registered‘).
Editoval h4kuna (7. 2. 2012 9:50)