Dynamické ACL – mazání příspěvků (všechny|vlastní)
- darthcz
- Člen | 113
Dobrý den,
chtěl bych se zeptat, jak řešíte dynamické acl, založené na rolích, zdrojích a privilegiích, pokud chci, aby bylo možné omezit roli member, zdroj AdModule:AdPresenter a privilege delete buď na vlastní příspěvky, nebo na příspěvky ostatních uživatelů, nebo na vše. Obecně bych rád umožňoval oprávnění i na základě jenom vlastní/vše.
Inspiroval jsem se u GUI ACL doplněk v nette u základního návrhu databáze. SQL je pro názornost zkráceno.
CREATE TABLE IF NOT EXISTS `acl` (
`acl_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`role_id` INT UNSIGNED NOT NULL ,
`privilege_id` INT UNSIGNED NOT NULL ,
`resource_id` INT UNSIGNED NOT NULL ,
`permission` CHAR(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`acl_id`))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `resource` (
`resource_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`identifier` VARCHAR(70) NOT NULL ,
`name` VARCHAR(255) NOT NULL ,
`comment` VARCHAR(255) NULL ,
PRIMARY KEY (`resource_id`) )
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `privilege` (
`privilege_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`identifier` VARCHAR(70) NOT NULL ,
`name` VARCHAR(70) NOT NULL ,
`comment` VARCHAR(255) NULL ,
PRIMARY KEY (`privilege_id`) )
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `role` (
`role_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`identifier` VARCHAR(70) NOT NULL ,
`name` VARCHAR(45) NOT NULL ,
`comment` VARCHAR(255) NULL ,
PRIMARY KEY (`role_id`) )
ENGINE = InnoDB;
Za rady předem děkuji.
- Felix
- Nette Core | 1198
Muzes pouzit bud overovani annotaci, celou logiku si ale musis napsat sam napriklad do metody checkRequirements
/**
* @User(role = Admin, privilege = delete)
*/
public function actionDelete($id) {
//...
}
Nebo se dotazovat primo uzivatele nebo authorizatoru
public function actionDelete($id) {
$this->user->isAllowed($resource, $privilege);
// nebo
$this->getAuthorizator()->isAllowed($role, $resource, $privilege);
}
- darthcz
- Člen | 113
To ano. Šlo mi spíše o dynamické nastavování omezovacích funkcí. Například role admin může mazat příspěvky všech uživatelů, avšak role member může mazat pouze svoje. Zároveň názvy rolí nejsou dopředu známy. Jsou nastavovány a vytvářeny dynamicky administrátorem.
Mysleli jsme něco jako vytvořit tabulku assertion, kde bude Název omezení a jméno funkce, která dané omezení vykoná. Při kontrole oprávnění by se pak prošly všechny omezovací funkce přiřazené danému ACL. Administrátor si ke každému ACL tyto funkce může zaklikat libovolně dle uvážení.
Takže například nakliká role member, resource AdModule:AdPresenter, privilege delete, assertion onlyOwn a member pak bude moci mazat pouze svoje příspěvky.