Authorizator – definice pravidla pro všechny Resources

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tomik
Nette Evangelist | 485
+
0
-

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?

David Grudl
Nette Core | 8154
+
0
-

Můžeš poslat přesnou chybovou hlášku?

Tomik
Nette Evangelist | 485
+
0
-

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.

Ola
Člen | 385
+
0
-

Zkoušel ses odhlásit a zase přihlásit?

Tomik
Nette Evangelist | 485
+
0
-

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

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

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

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

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

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?…