BasePresenter beforeRender získání názvu presenteru a akce

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

Zdravíčko v pátek. Doufám, že se všichni bavíte a pokud by jste našli trošku času mi pomoct byl bych velice rád.. Jde o toto udělal jsem si PermissionManager funguje dobře teď už mě jen čeká jediná věc zapojit ho do systému. Proto potřebuji získát URL ve tvaru Login:default nebo jakákoliv jiná stránka v BasePresenteru.

Díky za případné rady.

romiix.org
Člen | 343
+
+3
-
$this->getName() . ':' . $presenter->getAction();
Isigarek
Člen | 74
+
0
-

Díky moc funguje :)

F.Vesely
Člen | 369
+
+3
-

Permissions bych resil uz ve startup(), v beforeRender() je pozde.

Isigarek
Člen | 74
+
0
-

Dobrý nápad předěláno ale teď mi více vadí, že mi nefunguje kontrola a háže to error po přenosu na jinou stránku…

**Call to a member function isAllowed() on null**

Toto vyhazuje u /register jenže u /login ne tak nevím :D

romiix.org
Člen | 343
+
0
-

Ukáž kód kde to používaš.

Isigarek
Člen | 74
+
0
-
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
	/**@var App\Model\PermissionManager*/
	private $permission;

	public function __construct(Model\PermissionManager $permission)
	{
		$this->permission = $permission;
	}

	public function startup()
	{
		parent::startup();
		if($this->getUser()->isLoggedIn())
		{
			if(!$this->permission->isAllowed($this->getUser()->identity->ID,$this->getName(),$this->getAction()))
			{
				$this->redirect("Error:notallowed",array($this->getName(),$this->getAction()));
			}
		}
		else
		{
			if(!$this->permission->isAllowed(0,$this->getName(),$this->getAction()))
			{
				$this->redirect("Error:notallowed",array($this->getName(),$this->getAction())); //TENTO
			}
		}
	}

}
David Matějka
Moderator | 6445
+
0
-

Pravdepodobne v konkretnim presenteru prepisujes konstruktor a nevolas rodicovsky konstruktor base presenteru. Do base presenteru je lepsi predavat zavislosti inject metodou nebo inject anotaci

romiix.org
Člen | 343
+
0
-

Po formálnej stránke by som to zjednodušil na:

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
	/** @var App\Model\PermissionManager @inject */
	public $permission;

	public function startup()
	{
		parent::startup();
		if(!$this->permission->isAllowed(($this->getUser()->isLoggedIn()) ? $this->getUser()->identity->ID : 0, $this->getName(), $this->getAction()))
			$this->redirect("Error:notallowed", [$this->getName(), $this->getAction()]);
	}

}

Editoval romiix.org (13. 11. 2015 22:29)

CZechBoY
Člen | 3608
+
0
-

No a co když potřebuje ověřit oprávnění na editaci konkrétní skupiny uživatelů (např.)? To může nejdřív v Presenter::actionXXX, kde se poprvé dostanou parametry a lze redirectovat.
https://doc.nette.org/…n/presenters#…

Pavel Janda
Člen | 977
+
+3
-

Kontrola oprávnění by se měla dít v metodě Presenter::checkRequirements, tedy ještě před startupem Presenteru..

Editoval Pavel Janda (14. 11. 2015 9:36)

CZechBoY
Člen | 3608
+
0
-

@PavelJanda no a co když kontroluju právě oprávnění na editaci nějaké skupiny.
Nebo kdybych měl forum tak oprávnění jestli můžu psát příspěvek do daného fora.
Tak to dřív než v akci nezjistím, nebo jo? Někde přes

$presenter->getParameter

?

Editoval CZechBoY (14. 11. 2015 10:56)

Pavel Janda
Člen | 977
+
+1
-

Presenter::checkRequirements se volá při každém requestu dvakrát. Jednou pro presenter (dostaneš jako argument reflexi Presenteru) a jednou pro akci (dostaneš jako argument reflexi metody actionBlabla).

Sice nevím úplně přesně, co myslíš tou skupinou, ale tohle by ti mělo snad stačit.

CZechBoY
Člen | 3608
+
0
-

Parametry, už jsem to psal.
Např uživatel má prava editovat skupinu registered, ale nemá práva editovat skupinu admin.

Nebo psaní do for.
Uživatel nemá práva na Zakládání témat ve fóru Novinky, admin ty pravá má.
Případně viditelnost nějakého soukromého fóra pro adminy, aby seteda daly použít parametry v actionZobrazForum($idForum).

Při tom vkládání hodnot by se kde měly kontrolovat práva? V onValidate?

Pavel Janda
Člen | 977
+
0
-

No jak jsem psal, jednou se ti v aplikaci zavolá metoda checkRequirments pro danou akci. V té budeš mít k dispozici mimo jiné parametry requestu.

Zde jsem popsal jeden ze způsobů, kterým lze nasadit jednoduchou ACL. V tvém případě bych si u každé akce zavedl anotaci @privilege. Ta by se starala o to, aby mohla některá role třeba mazat a měnit, některá jen číst. To je taková statická ACL. Pak do toho lze zapojit i databázi, ale to už si musíš vymyslet sám podle zadání aplikace.

CZechBoY
Člen | 3608
+
0
-

@PavelJanda jasně no, ale to bych v checkRequirements musel mít kontrolu pro všechny akce toho daného Presenteru.

Btw. jak řešit přístup třeba k formuláři? Vytvořit form normálně pro všechny uživatele a při odeslání kontrolovat přes checkRequirements autorizaci? Nebo ani nedělat komponentu a vrátit NULL/''?

Pavel Janda
Člen | 977
+
0
-

@PavelJanda jasně no, ale to bych v checkRequirements musel mít kontrolu pro všechny akce toho daného Presenteru.

Můžeš kontrolovat práva přístupu pouze v momentě, kdy má daná akce/presenter nastavenou příslušnou anotaci.

>

Btw. jak řešit přístup třeba k formuláři? Vytvořit form normálně pro všechny uživatele a při odeslání kontrolovat přes checkRequirements autorizaci? Nebo ani nedělat komponentu a vrátit NULL/''?

Myslíš čistě k jednomu formuláři na stránce? Asi budeš muset dát IFku do latte a pak nějaký csrf token do formuláře, kdyby to někdo chtěl mermomocí odeslat a znal URL.

Oli
Člen | 1215
+
0
-

@CZechBoY Form pokud k němu nemají uživatelé přístup, tak ani neuvidí. Buď nemají přístup do celé akce nebo je ta komponenta, která zobrazuje form obalená nějakým {if $user->isAllowed('edit', 'article')}{component articleForm}{/if}. Pokud nemají přístup do celé akce (u mě nejčastější případ) tak to ani neodešlou. Pokud jen nevidí ten formulář, tak ještě hned po odeslání formuláře ověř, jestli na to má práva.

Proti csrf útokům má Nette obranu, jen ji musíš zapnout: $form->addProtection('Vypršel časový limit, odešlete formulář znovu');.

CZechBoY
Člen | 3608
+
0
-

@PavelJanda teďka nepočítám s tvým modulem. Zatím jen teoreticky přemejšlim jak autorizovat editaci uživatele, který má X rolí. Určitý subadmin má možnost editovat Y rolí a já chci, aby nemohl editovat uživatele, který bude mít o 1+ roli víc než on má povoleno. Např. uživatel ebude mít role a,b,c a admin práva jen na b,c.

@Oli @PavelJanda aha, to je pravda, měl by stačit IF v latte a přes csrf to neprojde :-)
Díky