2014-09-07 1 views
1

je besoin d'un ACL pour ma couche d'application et j'ai cherché dans Zend ACL qui semble couvrir mes besoins mais je suis confus par ce qui suit [1]:Zend ACL et l'accès à des objets spécifiques

Par exemple, si une règle par défaut doit être appliquée à chaque bâtiment dans une ville , il suffit d'affecter la règle à la ville, au lieu de en affectant la même règle à chaque bâtiment. Cependant, certains bâtiments peuvent nécessiter des exceptions à une telle règle, ce qui peut être réalisé en Zend\Permissions\Acl\Acl en affectant de telles règles d'exception à chaque bâtiment qui requiert une telle exception.

C'est génial. Exactement ce dont j'ai besoin. Cependant, comment puis-je accomplir cela?

A la lecture de la documentation de Zend ACL, je ne trouve pas d'exemple. Donc, disons que j'ai une ressource City et Building et que chacun implémente le ResourceInterface. Quelque chose comme ceci:

class City implements ResourceInterface { 

    public function getResourceId() 
    { 
     return "city"; // Is this supposed to be the "type" or the "unique Id"? 
    } 

    public $buildings = array(); 

} 

class Building implements ResourceInterface { 

    public function getResourceId() 
    { 
     return "building"; // Again, the "type" or "unique Id"? 
    } 

} 

Comme les commentaires dans le code ci-dessus pourraient déjà faire clairement, quelle est la ressource Id? représente-t-il le "type" de la ressource, c'est-à-dire qu'il s'agit d'une ville ou d'un bâtiment, ou doit-il être un identifiant unique, c'est-à-dire "ville-1", etc.

Si la réponse est qu'il doit être le "type" alors la question devient; comment puis-je spécifier des bâtiments uniques? Cependant, si la réponse est que l'Id doit être unique, alors la question devient; Comment puis-je identifier le «type» de la ressource et l'autorisation «couverture» de chaque bâtiment, comme indiqué dans la citation tirée de la documentation.

Toute idée serait grandement appréciée.

[1] http://zf2.readthedocs.org/en/latest/modules/zend.permissions.acl.intro.html

+0

il peut peut-être aider à: http://stackoverflow.com/questions/11668785/zend-acl-dynamic-assertion il a un exemple. –

Répondre

2

les resource Id doit être une valeur unique. et pour assigner des règles globales, vous devez utiliser l'héritage pour les ressources. simple, vous devez passer la ressource city en tant que parent pour la ressource building lorsque vous ajoutez des ressources à l'acl.

Voici un exemple:

$acl = new Acl(); 

//the original Acl resource class takes a `resourceId` as constructor parameter 
$mycity1 = new Resource('mycity1'); 
$acl->addResource($mycity1); 

$mybuiding1 = new Resource('mybulding1'); 
//city is the buildings parent 
$acl->addResource($mybuiding1,$mycity1); 

//you dont even have to create a class just define the resource as string 
$acl->addResource('secure_buildings',$mycity1); 

$acl->addRole('myrole1'); 
//roles have inheritance too 
$acl->addRole('myrole2','myrole1'); 

//myrole1 and myrole2 has access to city and all its building 
$acl->allow('myrole1','mycity1'); 
//myrole2 has access to city and all its building except 'secure_buildings' 
$acl->deny('myrole2','secure_buildings'); 

la ressource enfant bulding hérite des règles du parent city si aucune est définie pour elle.

Mise à jour pour commentaire:

ACL ne sait pas et ne se soucie pas ce type de ressource que vous avez aussi longtemps qu'ils ont ids des ressources uniques, menaces acl toutes les ressources que l'égalité et ne regarde que pour resourceId et l'héritage.

lorsque vous définir les règles que vous ne devez fournir les resourceId pour la allow et deny, peu importe quel type ils sont aussi longtemps qu'ils sont définis comme une ressource et ajouté à la pile de l'ACL.

et quand vous faites $acl->inAllowed vous avez seulement besoin roleId et resourceId et encore acl ne se soucient pas de leur type, seulement qu'ils ont été définis comme une ressource abd qu'ils ont des parents ou non ...

Exemple: J'espère que cela suffit exemple

$acl = new Acl(); 
$acl->addResource('City'); //all the cities 
$acl->addResource('myCity1', 'City'); //city1 inherits City 
$acl->addResource('Building', 'City'); //all the buildings in all the cities 
$acl->addResource('normal_buildings', 'Building'); 
$acl->addResource('secure_buildings', 'Building'); 
$acl->addResource('top_secure_buildings', 'secure_buildings'); 

$acl->addRole('Civilian'); 
$acl->addRole('High_Level_Security', 'Civilian'); 

$acl->allow('Civilian', 'City'); 
$acl->deny('Civilian', 'secure_buildings'); 

$acl->allow('High_Level_Security', 'secure_buildings'); 
$acl->deny('High_Level_Security', 'top_secure_buildings'); 

var_dump($acl->isAllowed('Civilian', 'City'));//true -> direct allow rule 
var_dump($acl->isAllowed('Civilian', 'myCity1'));//true -> inherited from City allow rule 
var_dump($acl->isAllowed('Civilian', 'Building'));//true -> inherited from City allow rule 
var_dump($acl->isAllowed('Civilian', 'normal_buildings'));//true -> inherited from City allow rule 
var_dump($acl->isAllowed('Civilian', 'secure_buildings'));//false -> direct deny rule 
var_dump($acl->isAllowed('Civilian', 'top_secure_buildings'));//false -> inherited from secure_building deny rule 

var_dump($acl->isAllowed('High_Level_Security', 'City'));//true -> inherited from Civilian->City allow rule 
var_dump($acl->isAllowed('High_Level_Security', 'myCity1'));//true -> inherited from Civilian->City allow rule 
var_dump($acl->isAllowed('High_Level_Security', 'Building'));//true -> inherited from Civilian->City allow rule 
var_dump($acl->isAllowed('High_Level_Security', 'normal_buildings'));//true -> inherited from Civilian->City allow rule 
var_dump($acl->isAllowed('High_Level_Security', 'secure_buildings'));//true -> direct allow rule 
var_dump($acl->isAllowed('High_Level_Security', 'top_secure_buildings'));//false -> direct deny rule 
+0

mis à jour la réponse avec un échantillon, et vous réalisez que Zend en open source et vous pouvez réellement vérifier le code source pour comprendre ce qui se passe? droite ? si vous vérifiez le code, vous verrez que acl ne donne pas le type de la ressource ****, et si la ressource n'a pas de règle directe, elle vérifie le parent et ainsi de suite ... – Exlord

+0

Votre dernière mise à jour prend tout son sens maintenant . Merci de votre aide. – Luke

Questions connexes