Nastavení role admina v Authorizátoru
- Allconius
- Člen | 317
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 | 1280
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 | 317
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 | 1280
All je v nové verzi, ALL ve starší. Koukáš na dokumentaci jiné verze, než kterou máš nainstalovanou.
- nightfish
- Člen | 519
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.
V 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 | 317
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 konstantuAll
neobsahuje.V 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 | 317
Marek Bartoš napsal(a):
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 | 317
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';
}
}