Dynamické ACL – mazání příspěvků (všechny|vlastní)

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

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

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

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.