J'ai divisé en trois articles la gestion des permissions avec une base de données car tout mettre sur un seul billet aurait été trop dense. Il nous faut, pour gérer les acl avec une base de données, trois tables. Enfin c'est comme cela que je les gère dans le CMS Zend.

Resources

Cette table permet de stocker les différentes ressources par le nom des modules, des controllers et des actions.

  CREATE  TABLE IF NOT EXISTS `cms`.`resources` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `modules` VARCHAR(45) NOT NULL ,
  `controllers` VARCHAR(45) NOT NULL DEFAULT 'index' ,
  `actions` VARCHAR(45) NOT NULL DEFAULT 'index' ,
  PRIMARY KEY (`id`) )
  ENGINE = INNODB;

Roles

Ici seront renseignés le nom des différents rôles que le site peut avoir (par exemple guest, member, super utilisateur). La colonne "héritage" va permettre de mettre en place la notion de parent pour faire hériter des privilèges à d'autres rôles.

    CREATE  TABLE IF NOT EXISTS `cms`.`roles` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `label` VARCHAR(20) NOT NULL ,
  `name` VARCHAR(20) NOT NULL ,
  `heritage` VARCHAR(20) NULL ,
  PRIMARY KEY (`id`) )
  ENGINE = INNODB;

Resources_roles

Enfin, cette table de correspondance va définir précisément les privilèges de chaque rôle sur une ressource par le biais de la colonne access (deny/allow).

    CREATE  TABLE IF NOT EXISTS `cms`.`resources_roles` (
  `id` INT(255) NOT NULL AUTO_INCREMENT ,
  `resources_id` INT(255) NOT NULL ,
  `roles_id` INT(255) NOT NULL ,
  `access` VARCHAR(5) NOT NULL ,
  PRIMARY KEY (`id`, `resources_id`, `roles_id`) ,
  INDEX `fk_resources_has_roles_resources1` (`resources_id` ASC) ,
  INDEX `fk_resources_has_roles_roles1` (`roles_id` ASC) ,
  CONSTRAINT `fk_resources_has_roles_resources1`
    FOREIGN KEY (`resources_id` )
    REFERENCES `cms`.`resources` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_resources_has_roles_roles1`
    FOREIGN KEY (`roles_id` )
    REFERENCES `cms`.`roles` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
    ENGINE = INNODB;

Une fois les tables crées, il faut mettre en place les classes de relations avec les tables puis les modèles qui récupèrerons les valeurs dans les tables.
Voici les classes respectives aux tables :
Les ressources

<?php 
class Tables_Resources extends Tables {
	protected $_name = 'resources';
	protected $_primary = 'id';
} 
?>

Les rôles

<?php 
class Tables_Roles extends Tables {
	protected $_name = 'roles';
	protected $_primary = 'id';
} 
?>

Les privilèges

<?php
  class Tables_Privileges extends Tables {
    protected $_name = 'resources_roles';
    protected $_primary = 'id';  
} 
?>

Retrouvez la suite de ce billet dans l'article sur la gestion des permissions, les modèles.