BasePresenter beforeRender získání názvu presenteru a akce
- Isigarek
- Člen | 74
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.
- Isigarek
- Člen | 74
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
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
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
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
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
@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
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
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
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
@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
@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
@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
@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