nastavení zdrojů resources pro admina v ACL při dynamickém načítání práv

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

Dobrý den,
prokousal jsem se nastavením ACL a konkrétně dynamických práv pro admina
Mám ale problém
pokud povoluji hlavnímu adminovi zdroje např. pouze takto

$this->allow(‚admin‘, ‚Admin:Default‘, Permission::ALL);
$this->allow(‚admin‘, ‚Admin:Page‘, Permission::ALL);
pomocí foreach

<?php
 foreach($model->getRules() as $rule)
      $this->{$rule->allowed == 'Y' ? 'allow' : 'deny'}($rule->role, $rule->resource, $rule->privilege);
?>

tak mně to vyhodí vždy na přihlašovací stranu s tím že nemám dostatečné práva
a pokud přiřadímnatvrdo takto tak mně to ihned pustí do administrace

$this->allow(‚admin‘, Permission::ALL, Permission::ALL);

Nevíte v čem může být zakopaný pes?
Díky

Editoval cirdaz (7. 3. 2011 15:54)

bojovyletoun
Člen | 667
+
0
-

Problém může být v tom, pořadí přiřazování. Zkus použít pro zjištění isallowed/roleinheritsfrom/resourceinheritsfrom/getroleparents/hasrole/hasresource..

BTW: jak zjistím všechny všechny role/resource? Žádná metoda getAllRoles není.

PS. Nechtěl jsem se zatěžovat s databází pro ACL, tak jsem si řekl, že ACL budu serializovat do souboru (třeba pomocí Filestorage… proof of concept zde, je třeba nějak zapouzřit otevírání a tvorbu prázdného ACL)

$fs=new \Nette\Caching\FileStorage(__APPDIR__."/var", NULL);
$acl= $fs->read("acl");
$acl->addRole(\Nette\String::random());
$fs->write("acl", $acl,array());

Co myslíte, je to dobré řešení, nebo to přinese problémy?

cirdaz
Člen | 21
+
0
-

Pořadí jsem zkusil změnit ale výsledek je stejný…
Zjistil jsem i zda ten resource existuje tak ano

<?php
if($this->hasresource($rule->resource)==1) echo $rule->resource.'ano';exit;
?>
cirdaz
Člen | 21
+
0
-

Načítá se to v takovémto pořadí
Y admin Admin:Cathegory Permission::ALL
Y admin Admin:User Permission::ALL
Y admin Admin:Page Permission::ALL
Y admin Admin:Default Permission::ALL

Filip Procházka
Moderator | 4668
+
0
-

Doporučoval bych použít nějaký „otevřenější“ permission objekt, který lze serializovat do session :)

Patrik Votoček
Člen | 2221
+
0
-

HosipLan napsal(a):

…serializovat do session :)

to bych ho spíš serializoval do cache… a „nezasíral“ zbytečně session navíc při změně se dá jednoduše invalidovat kdežto session moc ne…

cirdaz
Člen | 21
+
0
-

takže se mi to povedlo konečně rozjet po dlouhém zkoumání toho jak to tam má být…
Všechno fungovalo až na jednu věc
ve funkci pro privilegování práv nemá být PERMISSION::ALL ale „default“

$this-allow(‚admin‘, ‚PERMISSION::ALL‘,‚PERMISSION::ALL‘)

<?php
// privileges spatne protoze dynamicky z db se to nacte takto coz je blbost.

$this->allow('member', 'Admin:Default', 'Permission::ALL');
$this->allow('editor', 'Admin:Page', 'Permission::ALL');
// dobre
$this->allow('admin', 'Admin:USER', 'default');
$this->allow('admin', 'Admin:Ddefault', 'default');
atd...

a fci pak upravit treba takto
foreach($model->getRules() as $rule){
   if($rule->privilege=='default') $privilege=Permission::ALL;else $privilege=$rule->privilege;
       $this->{$rule->allowed == 'Y' ? 'allow' : 'deny'}($rule->role, $rule->resource, $privilege);
}
//nebo ji klidne nechat i takto ono to sezere $rule->privilege=='default'

    foreach($model->getRules() as $rule)
       $this->{$rule->allowed == 'Y' ? 'allow' : 'deny'}($rule->role, $rule->resource,$rule->privilege);
?>

Tudíž tabulka bude vypadat takto

<?php
CREATE TABLE IF NOT EXISTS `acl` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id_role` tinyint(1) NOT NULL DEFAULT '0',
  `id_privilege` tinyint(1) NOT NULL DEFAULT '0',
  `id_resource` tinyint(1) NOT NULL DEFAULT '0',
  `allowed` enum('Y','N') COLLATE utf8_czech_ci NOT NULL DEFAULT 'Y'
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=13 ;

--
-- Vypisuji data pro tabulku `acl`
--

INSERT INTO `acl` (`id`, `id_role`, `id_privilege`, `id_resource`, `allowed`) VALUES
(1, 1, 1, 1, 'Y')

-- --------------------------------------------------------

--
-- Struktura tabulky `acl_privileges`
--

CREATE TABLE IF NOT EXISTS `acl_privileges` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nazev` varchar(100) COLLATE utf8_czech_ci NOT NULL
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=2 ;

--
-- Vypisuji data pro tabulku `acl_privileges`
--
//tady místo PERMISSION::ALL se dá default
//napište prosím co ještě by zde mělo být místo toho default
INSERT INTO `acl_privileges` (`id`, `nazev`) VALUES
(1, 'default');



-- --------------------------------------------------------

--
-- Struktura tabulky `acl_resources`
--

CREATE TABLE IF NOT EXISTS `acl_resources` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nazev` varchar(100) COLLATE utf8_czech_ci NOT NULL
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=6 ;

--
-- Vypisuji data pro tabulku `acl_resources`
--

INSERT INTO `acl_resources` (`id`, `nazev`) VALUES
(1, 'Admin:Default'),
(2, 'Admin:Page'),
(3, 'Admin:User'),
(4, 'Admin:Cathegory');

-- --------------------------------------------------------

--
-- Struktura tabulky `acl_roles`
--

CREATE TABLE IF NOT EXISTS `acl_roles` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id_parent` tinyint(1) NOT NULL DEFAULT '0',
  `nazev` varchar(100) COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=6 ;

--
-- Vypisuji data pro tabulku `is_acl_roles`
--

INSERT INTO `acl_roles` (`id`, `id_parent`, `nazev`) VALUES
(1, 1, 'admin'),
(2, 3, 'editor'),
(3, 4, 'member'),
(4, 4, 'guest');

?>

Editoval cirdaz (8. 3. 2011 14:06)

Aurielle
Člen | 1281
+
0
-

Permission::ALL nemá co dělat v apostrofech, je to konstanta a nikoliv string.