Nastavení role admina v Authorizátoru

Allconius
Člen | 313
+
0
-

Ahoj,
podle dokumentace jsem si vytvořil Authorizator:

declare(strict_types=1);

namespace App\Auth;

use Nette;

class Authorizator
{
    public static function create(): Nette\Security\Permission
    {
        $acl = new Nette\Security\Permission;
        $acl->addRole('host');
        $acl->addRole('registrace', 'host');
        $acl->addRole('redaktor', 'registrace');
        $acl->addRole('admin', 'redaktor');
        $acl->addResource('aktuality');
        $acl->addResource('clanky');
        $acl->addResource('menu');
        $acl->addResource('anketa');
        $acl->addResource('komentar');
        $acl->allow('host', ['aktuality', 'clanky', 'menu'], 'view');
        $acl->allow('host', 'anketa', 'vote');
        $acl->allow('redaktor', 'clanky', 'add');
        $acl->allow('admin', $acl::All, ['view', 'edit', 'add']);
        $acl->deny('admin', 'komentar', 'edit');
        return $acl;
    }
}



ale vypisuje mi to „Undefined constant Nette\Security\Permission::All“ co tam mám špatně ?

Marek Bartoš
Nette Blogger | 1177
+
0
-

Tak si tu třídu (a její interface) rozklikni a podívej se, jak se ty konstanty jmenují :) Nejspíš koukáš na dokumentaci jiné verze než máš nainstalovanou

Allconius
Člen | 313
+
0
-

Marek Bartoš napsal(a):

Tak si tu třídu (a její interface) rozklikni a podívej se, jak se ty konstanty jmenují :) Nejspíš koukáš na dokumentaci jiné verze než máš nainstalovanou

Ahoj, v dokumentaci je self:All: https://api.nette.org/…mission.html

Ale phpstorm mi nabídl ALL a to prošlo, tak tam asi musí být velký „LL“:

$acl->allow('admin', $acl::ALL, ['view', 'edit', 'add']);
Marek Bartoš
Nette Blogger | 1177
+
+1
-

All je v nové verzi, ALL ve starší. Koukáš na dokumentaci jiné verze, než kterou máš nainstalovanou.

Allconius
Člen | 313
+
0
-

Marek Bartoš napsal(a):

All je v nové verzi, ALL ve starší. Koukáš na dokumentaci jiné verze, než kterou máš nainstalovanou.

Mám verzi v3.1.10, aktuální je v3.1.11, to tam byly takové změny ?

nightfish
Člen | 474
+
0
-

Allconius napsal(a):
Mám verzi v3.1.10, aktuální je v3.1.11, to tam byly takové změny ?

@Allconius Díváš se na nesprávný balíček – zajímá tě nette/security, který verzi 3.1.10 nemá. Nejnovější vydaná je 3.1.7, která však konstantu All neobsahuje.

dokumentaci je nyní výchozí pohled nastavený na verzi 4, která však ještě není vydaná (pro nette/security) – když se přepneš na dokumentaci k verzi 3, tak v ní uvidíš $acl::ALL.

Allconius
Člen | 313
+
0
-

nightfish napsal(a):

Allconius napsal(a):
Mám verzi v3.1.10, aktuální je v3.1.11, to tam byly takové změny ?

@Allconius Díváš se na nesprávný balíček – zajímá tě nette/security, který verzi 3.1.10 nemá. Nejnovější vydaná je 3.1.7, která však konstantu All neobsahuje.

dokumentaci je nyní výchozí pohled nastavený na verzi 4, která však ještě není vydaná (pro nette/security) – když se přepneš na dokumentaci k verzi 3, tak v ní uvidíš $acl::ALL.

Ahoj, díky aha to bude ono :-) A je někde nějaký příklad použití v presenteru ? když si tu autorizaci přidám v basepresenteru:


use Nette;
use App\Model\DbManager;
use App\Auth\Authorizator;
use App\Components\Sign\SignControl;
use App\Components\Sign\SignControlFactory;
use App\Components\Contacts\PhonebookControl;
use App\Components\Contacts\PhonebookControlFactory;
use App\Components\News\NewsControl;
use App\Components\News\NewsControlFactory;
use App\Components\Navig\NavigControl;
use App\Components\Navig\NavigControlFactory;
use Nette\PhpGenerator\Dumper;
use Nette\Utils\DateTime;
use Nette\Application\UI\Form;


abstract class BasePresenter extends Nette\Application\UI\Presenter
{

    public function __construct(
        protected DbManager $dbManager,
        protected Authorizator $acl,
        protected SignControlFactory $signControlFactory,
        private PhonebookControlFactory $phonebookControlFactory,
        private NewsControlFactory $newsControlFactory,
        private NavigControlFactory $navigControlFactory
    )
    {

    }

tak mi to zařve:

Nette\DI\ServiceCreationException

Service 'application.1' (type of App\Presenters\AdminPresenter): Service of type App\Auth\Authorizator required by $acl in App\Presenters\BasePresenter::__construct() not found. Did you add it to configuration file?

Allconius
Člen | 313
+
0
-

Marek Bartoš napsal(a):

https://doc.nette.org/…uthorization#…

Ahoj, díky a omlouvám se za zmatek měl jsem chybu i v autentizaci proto mi pak v presenteru nefungovala ani ta autorizace :-)

Allconius
Člen | 313
+
0
-

Ahoj, ještě dotaz ohledně rolí a zdrojů jako objektů, pokud mám v šabloně:

        {if $user->isAllowed('clanky', 'add')}
            <div class="menu">:: <a n:href="Admin: 0">Přidej nový záznam</a></div>
        {/if}

        {foreach $clanky as $clanek}
		{if $user->isAllowed('clanky', 'edit')}
            <div class="clanek"><a n:href="Admin: $clanek->id">{$clanek->nazev}</a></div>
        {/if}
		{/foreach}

jak můžu upravit to pravidlo s těmi objekty? Tzn. potřeboval bych to u té editace změnit na to objektové pravidlo, aby se zobrazoval jen ten článek, který patří přihlášenému uživateli:

        {if $user->isAllowed('clanky', 'add')}
            <div class="menu">:: <a n:href="Admin: 0">Přidej nový záznam</a></div>
        {/if}

        {foreach $clanky as $clanek}
	    {$userid = new Editor($iduser)}
   		{$clanekid = new Clanky($clanek->id)}
		{if $user->isAllowed($userid, $clanekid, 'edit')}
        <div class="clanek"><a n:href="Admin: $clanek->id">{$clanek->nazev}</a></div>
    	{/if}
		{/foreach}

Ale nevím jak to napsat do šablony, nebo je potřeba to řešit v presenteru a pak si to nějak předávat ?
Authorizator.php

declare(strict_types=1);

namespace App\Auth;

use Nette;

class Authorizator
{
    public static function create(): Nette\Security\Permission
    {
        $acl = new Nette\Security\Permission;
        $acl->addRole('guest');
        $acl->addRole('registered', 'guest'); // 'registered' dědí od 'guest'
        $acl->addRole('editor', 'registered');
        $acl->addRole('admin', 'editor'); // a od něj dědí 'admin'

        $acl->addResource('aktuality');
        $acl->addResource('clanky');
        $acl->addResource('menu');
        $acl->addResource('anketa');
        $acl->addResource('komentar');

        $acl->allow('guest', ['aktuality', 'clanky', 'menu'], 'view');
        $acl->allow('guest', 'anketa', 'vote');
        $acl->allow('editor', 'clanky', 'add');
        $acl->allow('admin', $acl::ALL, ['view', 'edit', 'add']);
        $acl->deny('admin', 'komentar', 'edit');

        $assertion = function (Permission $acl, string $role, string $resource, string $privilege): bool {
            $role = $acl->getQueriedRole();
            $resource = $acl->getQueriedResource();
            return $role->id === $resource->authorId;
        };

        $acl->allow('editor', 'clanky', 'edit', $assertion);

        return $acl;
    }
}

class Editor implements Nette\Security\Role
{
    public $id;

    public function getRoleId(): string
    {
        return 'editor';
    }
}


class Clanky implements Nette\Security\Resource
{
    public $authorId;

    public function getResourceId(): string
    {
        return 'clanky';
    }
}