nastavení zdrojů resources pro admina v ACL při dynamickém načítání práv
- cirdaz
- Člen | 21
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
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?
- Filip Procházka
- Moderator | 4668
Doporučoval bych použít nějaký „otevřenější“ permission objekt, který lze serializovat do session :)
- Patrik Votoček
- Člen | 2221
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
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)