Gestion des permissions, la base de données 1/3
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.
Commentaires
1. Le vendredi 11 septembre 2009 à 22:30, par Jonathan Juhasz
2. Le samedi 12 septembre 2009 à 08:22, par nicolas moricet
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.