ACL a zabezpeční signálů / handle

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

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

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

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

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

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

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