Disons que nous ajoutons de nouvelles ressources à l'ACL comme ceci:
<acl>
<resources>
<admin>
<children>
<catalog>
<children>
<search>
<children>
<import translate="title">
<title>Import</title>
</import>
<export translate="title">
<title>Export</title>
</export>
</children>
</search>
</children>
</catalog>
</children>
</admin>
</resources>
</acl>
Nous ajoutons ensuite ce qui suit autour d'un bouton qui apparaît dans la grille SearchTerm:
if (Mage::getSingleton('admin/session')->isAllowed('catalog/search/import')) {
$this->_addButton('import', array(
'label' => 'Import Search Terms',
'onclick' => "setLocation('".$this->getUrl('*/*/import')."')"
));
}
Si je me connecte ensuite en tant qu'utilisateur non administrateur, j'aurais vraiment pensé que le comportement attendu ne serait pas visible, car je n'ai pas explicitement donné au rôle des utilisateurs la ressource. Il s'avère cependant que la valeur de retour par défaut de isAllowed
semble être vraie. Pour aggraver les choses, lorsque vous allez consulter les ressources pour ce rôle, la case à cocher n'apparaîtra pas cochée.
Je peux résoudre le «problème» en cliquant sur chaque rôle et en cliquant sur enregistrer, mais c'est un PITA à faire en particulier dans les environnements live / stage / dev. Existe-t-il un moyen simple de refuser automatiquement cette ressource de chaque rôle via le code? Cela ne me dérange pas d'ajouter un script de migration si nécessaire. J'ai jeté un coup d'œil à ce qui se passe dans la même action. Vraisemblablement, je pourrais le faire en chargeant tous les rôles, en les parcourant et en exécutant une logique similaire à l' Mage_Admin_Model_Resource_Rules::saveRel
insertion des lignes dans la table. Mais ce code semble supposer que toutes les ressources sont publiées, ce qui signifie que pour l'invoquer directement, je devrais déterminer le format dont j'ai besoin pour transmettre les données et éventuellement charger les ressources existantes.
$session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())