Implementace ACL – chyba u 403 exception

d@rkWolf
Člen | 167
+
0
-

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)

F.Vesely
Člen | 369
+
0
-

A co ti to pise za chybu v logu?

d@rkWolf
Člen | 167
+
0
-

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

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

No jo, to bude asi vono. Nenapadá tě, jak tomu předejít? Já potřebuju zobrazovat tyhle chyby uvnitř administrace, proto jsem ten Error presenter extendoval z Base admin modulu.

F.Vesely
Člen | 369
+
0
-

Tak budto nejak zajistis, aby ti checkRequirements prochazel pro ten Presenter nebo nebudes od toho Admin Base vubec dedit.

Zalezi proc od nej dedis? To kvuli te flash message?

d@rkWolf
Člen | 167
+
0
-

Mno dědím od něj kvůli kvůli komplet layoutu, nejen flash messages, hlavně mám všechny odkazy uvnitř adminu ajaxový, všechno se musí překreslovat v content v @layout.latte

Editoval d@rkWolf (16. 4. 2020 9:42)

F.Vesely
Člen | 369
+
0
-

Asi nejlepsi bude, kdyz si ten Error4xxPresenter pridas do ACL jako dalsi resource a povolis ho pro vsechny.

d@rkWolf
Člen | 167
+
0
-

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.

F.Vesely
Člen | 369
+
0
-

Tak jsi tam asi spatne nastavil ten resource. Na tohle se hodi xdebug, abys pekne videl, co ti nefunguje tak, jak si myslis, ze by melo.