Implementace ACL – chyba u 403 exception
- d@rkWolf
- Člen | 167
Ahoj, mohl by mi prosím někdo poradit, kde dělám chybu? Snažím se implementovat ACL podle staršího návodu od Pavla Jandy ( https://github.com/…te/issues/52 ) , ale na Nette 3, základ(error presentery a tak) jsou z aktuálního Sandboxu pro Nette 3.
Mám udělanou Permission factory, nastaveny nějaké uživatele, nějaké zdroje a práva, zaregistrováno v configu, ale v případě, že se pokusím otevřít odkaz na presenter, na který nemám právo, vždy skončím na 500 Internal server error na řádku „throw new Nette\Application\ForbiddenRequestException;“ v metodě checkRequirements BasePresenteru AdminModulu(všechny presentery adminu mimo Sign od něj dědí, včetně Error4xxPresenteru):
<?php
public function checkRequirements($element): void
{
parent::checkRequirements($element);
if ($element instanceof \ReflectionMethod) {
// Check permissions for Action/handle methods
return;
} else {
// Check permissions for presenter access
$resource = $element->getAnnotation('resource');
}
if (!$this->getUser()->isLoggedIn()) {
$message = 'admin.not_logged';
if ($this->getUser()->getLogoutReason() === Nette\Security\IUserStorage::INACTIVITY) {
$message = 'admin.login_timeout';
}
$this->flashMessage($this->translator->translate($message), 'alert-warning');
$this->redirect('Sign:in', ['backlink' => $this->storeRequest()]);
} elseif (!$this->getUser()->isAllowed($resource)) {
$this->flashMessage($this->translator->translate('admin.not_allowed'), 'alert-danger');
throw new Nette\Application\ForbiddenRequestException;
}
}
?>
Potřebuju, aby to buď přesměrovalo na přihlášení(ta část funguje), nebo propadlo do Error4xxPresenter a vyplivlo mi to šablonu 403.latte. Resource se přečte správně, funkce isAllowed($resource) vrátí správně false když nemám přístup a na exception to crashne, místo aby to spadlo do error presenteru. Když řeším neexistující adresy (404), tak mi to normálně do Error4xxPresenteru propadne a dostanu požadovanou 404.latte, proto mi uniká důvod, proč to u práv padá.
Editoval d@rkWolf (14. 4. 2020 21:26)
- d@rkWolf
- Člen | 167
Tohle z toho vypadne, chybou je zvýrazněný řádek 72 s tím vyhozením ForbiddenRequest, ten by ale měl vyvolat Error4xxPresenter a jeho 403 šablonu, místo toho to ale exne přímo na tom vyvolání výjimky. Vypadá to, že mi ta checkRequirements metoda způsobuje na tom Throw… nekonečný cyklus, když jsem zkusil vyvolání výjimky zaměnit za $this->redirect na ten Error4xxPresenter, skončím v nekonečném cyklu-ale nechápu proč.
Nette\Application\ForbiddenRequestException #403 search►
File: …\AdminModule\Presenters\BasePresenter.php:72
62: }
63: $this->flashMessage($this->translator->translate($message),
‚alert-warning‘);
64: if ($this->isAjax()) {
65: $this->payload->forceRedirect = true;
66: }
67: $this->redirect(‚Sign:in‘, [‚backlink‘ ⇒
$this->storeRequest()]);
68: }
69:
70: if (!$this->getUser()->isAllowed($resource)) {
71:
$this->flashMessage($this->translator->translate(‚admin.user_not_allowed‘),
‚alert-danger‘);
72: throw new Nette\Application\ForbiddenRequestException;
73: }
74: }
75:
76:
…\src\Application\UI\Presenter.php:205
App\AdminModule\Presenters\BasePresenter->checkRequirements(
)
…\src\Application\Application.php:149
Nette\Application\UI\Presenter->run(
)
…\src\Application\Application.php:175
Nette\Application\Application->processRequest(
)
…\src\Application\Application.php:92
Nette\Application\Application->processException(
)
…\3_ostatni\web-base-start\www\index.php:10
Nette\Application\Application->run()
- F.Vesely
- Člen | 369
d@rkWolf napsal(a):
>v metodě checkRequirements BasePresenteru AdminModulu(všechny presentery adminu mimo Sign od něj dědí, včetně Error4xxPresenteru):
Presne tady je ten duvod, proc se ti to cykli. V tom
Error4xxPresenter
se znovu zavola checkRequirements
,
vyhodi vyjimku a Application
znovu zkusi
Error4xxPresenter
, atd.
- d@rkWolf
- Člen | 167
To mě napadlo jako jedna z prvních věcí – mám udělaného výchozího usera, od kterého dědí všechny ostatní(zatím to mám zadávané ručně, ale mělo by to časem přijít do DB, ale dokud nefunguje základní chování, nemá to smysl…) a ten má přiřazené resource, co by měly být dostupné pro každého přihlášeného(dashboard, editace vlastního účtu, error), ale nemělo to na chování žádný efekt.