2009-02-20 5 views
1

Nous avons une la structure suivante pour notre applicationModification des parents pour une ressource - ACL Zend - 1.7.3

require_once "Zend/Loader.php"; 
Zend_Loader::registerAutoload(); 
$acl = new Zend_Acl(); 

// application 
$acl->add(new Zend_Acl_Resource('application1')); 
// groups 
$acl->add(new Zend_Acl_Resource('group1'), 'application1'); 
$acl->add(new Zend_Acl_Resource('group2'), 'application1'); 
// fields 
$acl->add(new Zend_Acl_Resource('field1'), 'group1'); 
$acl->add(new Zend_Acl_Resource('field2'), 'group1'); 
$acl->add(new Zend_Acl_Resource('field3'), 'group2'); 
$acl->add(new Zend_Acl_Resource('field4'), 'application1'); 

// roles 
$acl->addRole(new Zend_Acl_Role('applicant')); 
$acl->addRole(new Zend_Acl_Role('admin'), 'applicant'); 

// permissions 
$acl->allow('applicant', 'application1', 'view'); 
$acl->allow('applicant', 'group1', 'edit'); 

Cela représente une base de données des applications des collèges et des groupes/domaines sont des composants d'une application collège. D'après ce qui précède, le demandeur a l'autorisation d'édition pour modifier field2.

La structure entière est stockée en tant qu'objet acl dans une base de données mysql. Après un certain temps, les administrateurs décident de déplacer le champ2 de groupe1 à groupe2, comment changer l'objet acl? J'ai vérifié le fichier Acl.php mais il n'y a pas de méthodes dans lesquelles on change le parent d'une ressource et met ainsi automatiquement à jour les règles/permissions.

Merci.

Shashikant

Répondre

1

Personnellement, je préfère ne pas stocker l'objet sérialisé ACL dans la base de données. Je préfère stocker les informations sur les rôles, les ressources et les autorisations directement dans les tables de base de données et créer un nouvel objet ACL à la volée lors de l'amorçage de l'application.

Si vous voulez vraiment sérialiser l'objet ACL dans la base de données, il peut vous être utile de supprimer les ressources en question et de les ajouter de nouveau à la liste de contrôle d'accès. Le code ressemblerait à quelque chose comme ça, même si je ne l'ai pas nourri à un interpréteur PHP:

$acl->remove('field2'); 
$acl->add(new Zend_Acl_Resource('field2'), 'group2'); 
+0

Je ne suis pas sûr si ce que le CG suggère est une bonne idée. Il s'agit en fait de la duplication de la fonctionnalité Zend_Acl dans un système personnalisé, donc vous ne pouvez en aucun cas utiliser Zend_Acl. Même [Zend Documentation] [1] suggère d'utiliser la sérialisation et le stockage dans la base de données ou dans le cache, donc je pense que c'est bon. [1]: http://framework.zend.com/manual/fr/zend.acl.advanced.html#zend.acl.advanced.storing –

0

Première réponse Pourquoi diable voulez-vous stocker cette logique d'accès dans la base de données ??? C'est une partie de ce que l'on appelle la logique métier, qui appartient normalement au script. La base de données est un endroit pour les données de source brutes, comme le fait, quel utilisateur a quel rôle. Je comprends que la partie logique soit mise en cache pour la performance.

Questions connexes