ACL – ukazkový příklad, který nefunguje dle očekávání

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ot@s
Backer | 476
+
0
-

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

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

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)