Authorizator – definice pravidla pro všechny Resources
- Tomik
- Nette Evangelist | 485
Pokud se snažím přidat pravidlo, že např. role
root smí všude všechno, tedy pomocí
$acl->allow('root');
, tak to zdruba zde https://api.nette.org/…ion.php.html#584
zkrachuje, protože sice metoda setRule
pozná, že pole
$resources
je sice prázdné, ale dál už nedojde k přidání
pravidla pro $rules['allPrivileges']
. Nedojde tedy nastavení
pravidla globálně pro všechny oblasti.
Pochopil jsem něco špatně, nebo je to bug?
- Tomik
- Nette Evangelist | 485
Chybová hláška není, jen prostě pokud mám hierarchii rolí třeba
takovou:
guest < registered < moderator < administrator < root
a
postupně povoluju a zakazuju přístupy (např. pro guesta
$this->deny('guest','users','action');
a jsem si naprosto
jistý, že nakonec se provede $this->allow('root');
, resp.
$this->allow('root', NULL, NULL);
, pak se stejně stane, že
$acl->isAllowed('root','users','action')
, pokud jsem
přihlášen jako root
, mi vrátí FALSE
– tedy,
že na to nemá právo, ale podle posledního pravidla, by měl mít právo na
všechno a všude.
Doufám, že jsem to popsal nějak pochopitelně.
Dík.
- Tomik
- Nette Evangelist | 485
Ola napsal(a):
Zkoušel ses odhlásit a zase přihlásit?
Samozřejmě, že ano. Ale zkoušel jsem i příkaz rovnou na Acl třídu,
tedy $acl->isAllowed('root','users','action')
, která má jako
parametr roli, takže není potřeba být vůbec přihlášený, abych zjistil,
zda to konkrétní daná role může.
- Tomik
- Nette Evangelist | 485
Aby bylo srozumitelnější v čem je problém, pokud si vezmeme tuto ukázku:
<?php
// Nahrajeme Nette loader
require_once 'Nette/loader.php';
// Permission objekt
$acl = new Permission();
// Vytvoříme role
$acl->addRole('guest');
$acl->addRole('root', 'guest');
// Vytvoříme zdroje
$acl->addResource('articles');
$acl->addResource('admin');
// Host může všechno číst
$acl->allow('guest', NULL, 'action');
// ale nesmí do adminu
$acl->deny('guest', 'admin', 'action');
// Root může všechno
$acl->allow('root');
// Ha! A přece nemůže!
Debug::dump($acl->isAllowed('root','admin','action'));
?>
Kdo by tipoval, že výsledek bude TRUE
by protipoval
kalhoty. :)
Tedy alespoň předpokládám (možná blbě), že pokud jako poslední
definované pravidlo je, že root
může všechno, pak by měl moc
všechno. :) Už tak není žádné další pravidlo, které by to
přepsalo.
- Ondřej Brejla
- Člen | 746
Nevím jestli to funguje, nezkoušel jsem, ale co třeba:
<?php
$acl->allow('root', NULL, 'action');
// obecně allow(komu, NULL, pole práv)
?>
Vycházím z dokumentace, kde se všechna práva nastavují
<?php
$acl->allow('administrator', NULL, array('action', 'edit'));
?>
- romansklenar
- Člen | 655
Dědí se i omezení, takže aby měl root právo „vidět“ administraci, musíš mu to výslovně povolit.
$acl->deny('guest', 'admin', 'action');
$acl->allow('root', 'admin', 'action');
Debug::dump($acl->isAllowed('root','admin','action')); // TRUE
Pokud chceš udělat ultimátního roota, který nemá žádné omezení, udělej to tak, že nebude žádná od nikoho dědit.
$acl->addRole('root');
EDIT: V dokumentaci je to špatně formulované… ale je pravda, že by bylo logičtější povolit všechna práva zápisem
$acl->allow('root', Permission::ALL, Permission::ALL);
// nebo
$acl->allow('root', NULL, NULL);
// nebo
$acl->allow('root');
Editoval romansklenar (17. 1. 2009 14:29)
- Tomik
- Nette Evangelist | 485
romansklenar napsal(a):
Dědí se i omezení, takže aby měl root právo „vidět“ administraci, musíš mu to výslovně povolit.
$acl->deny('guest', 'admin', 'action'); $acl->allow('root', 'admin', 'action'); Debug::dump($acl->isAllowed('root','admin','action')); // TRUE
Pokud chceš udělat ultimátního roota, který nemá žádné omezení, udělej to tak, že nebude žádná od nikoho dědit.
$acl->addRole('root');
EDIT: V dokumentaci je to špatně formulované… ale je pravda, že by bylo logičtější povolit všechna práva zápisem
$acl->allow('root', Permission::ALL, Permission::ALL); // nebo $acl->allow('root', NULL, NULL); // nebo $acl->allow('root');
Aha, zarazila mě právě ta formulace v dokumentaci. Dobrá. Ale to povolení všech práv by se mi líbilo! :)
Nevadí, stejně díky, dám si na to pozor, u roota nebudu mít předka a jidne si to halt budu muset hlídat.
- phx
- Člen | 651
Ono to funguje jako dedeni u objektu. Takze podedis i zakazy. Ona permission berou nejkonkretnejsi pravidlo. Takze onen zakaz je konkretnejsi nez obecne povoleni.
Krasne jsem to pochopil z Davidovych odkazu: https://forum.nette.org/…iewtopic.php?…