ACL a zabezpeční signálů / handle
- Tonda Žáček
- Člen | 18
Zdravím, pátral jsem jak pomocí ACL zabezpečit signály a nic jsem nenašel. Mohl bych poprosit o nasměrování?
- Pavel Janda
- Člen | 977
@TondaŽáček https://github.com/…resenter.php#L178
Stejně jako akci. :) :)
Článek: https://github.com/…te/issues/52 (až bude nové planette, bude dostupný novější článek v anglickém jazyce)
Demo:
composer create-project nette/web-project
<?php
namespace App\Presenters;
use Nette;
class HomepagePresenter extends Nette\Application\UI\Presenter
{
public function handleFoo()
{
// Code here
}
public function actionFoo()
{
// Code here
}
public function checkRequirements($element)
{
dump($element);
}
public function beforeRender()
{
die;
}
}
A jdi na URL: /homepage/foo?do=foo
Editoval Pavel Janda (25. 7. 2017 0:27)
- Tonda Žáček
- Člen | 18
A jak použiji allow/deny a isAllowed. Čerpal jsem odtud https://doc.nette.org/…thentication a tam je
<?php
if (!$this->user->isAllowed($this->name, $this->action)) {
?>
kde to kontroluje action, ale co s tím signálem?
- Čamo
- Člen | 798
Tonda
V tom príklade name = zdroj a action =
operácia. Všetko si musíš nadefinovať v autorizátore.
Nefunguje to samé odseba viď. https://doc.nette.org/…thentication#…
Ak postupuješ podľa toho príkladu v planette tak to treba dať do neonu.
A miesto $this->action
skús $this->getSignal()
Editoval Čamo (26. 7. 2017 11:32)
- CZechBoY
- Člen | 3608
např. takhle
<?php
namespace App\Presenters;
use Nette;
class HomepagePresenter extends Nette\Application\UI\Presenter
{
public function handleFoo()
{
// Code here
}
public function actionFoo()
{
// Code here
}
public function checkRequirements($element)
{
dump($element);
if ($element instanceof \ReflectionClass) {
if (!$this->user->isAllowed($this->name, 'default') { //nebo nějaký jiný výchozí název
throw new ForbiddenRequestException(...);
}
} elseif ($element instanceof \ReflectionMethod) {
if (!$this->user->isAllowed($this->name, $this->signal ?: $this->action) {
throw new ForbiddenRequestException(...);
}
}
}
public function beforeRender()
{
die;
}
}
?>
- zachrdlapetr
- Člen | 49
Tonda Žáček napsal(a):
Zdravím, pátral jsem jak pomocí ACL zabezpečit signály a nic jsem nenašel. Mohl bych poprosit o nasměrování?
nevím jestli jsi to vyřešil, ale toto by ti nebo ostatním mohlo pomoci. také se mi nelíbilo dávat další logiku přístupu do prezentéru.
Přes neon to zapíšeš:
- allow('admin') # povolit vše pro roli admin
- deny('admin','Admin:Orders','edit') #zakázat pro roli admin akci edit v prezentéru Orders
- deny('admin',['Admin:Orders','Admin:Products'],['delete','add']) #zakázat pro roli admin akce delete a add v prezentérech Orders a Products