Valeur par défaut de la ressource de rôle ACL

8

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 isAllowedsemble ê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::saveRelinsertion 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.

Peter O'Callaghan
la source
Vous n'êtes pas sûr d'utiliser correctement «isAllowed» - ne devrait-il pas en être ainsi? $session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())
Benubird
Cela me semble être un bug
Fabian Blechschmidt

Réponses:

2

Je n'ai pas pu recréer le problème sur 1.13.1.0. J'ai utilisé votre code exact sauf que je l'ai utilisé pour changer le titre de la page de manière conditionnelle. J'ai d'abord testé cela avec un utilisateur connecté avec toutes les autorisations et la méthode isAllowed a renvoyé true. J'ai ensuite créé un autre rôle qui ne comportait pas cette case à cocher mais toutes les autres cases étaient sélectionnées, puis je me suis déconnecté et reconnecté avec un utilisateur attaché à ce nouveau rôle et isAllowed renvoyait false. Vous pouvez essayer de vous déconnecter et de vous reconnecter. Si cela ne fonctionne toujours pas, essayez de vider votre cache et vos sessions et de vous reconnecter.

Jonathan Hodges
la source
0

La valeur par défaut dans Mage_Admin_Model_Sessionest en fait false(ne serait pas logique autrement):

public function isAllowed($resource, $privilege = null)
{
    $user = $this->getUser();
    $acl = $this->getAcl();

    if ($user && $acl) {
        if (!preg_match('/^admin/', $resource)) {
            $resource = 'admin/' . $resource;
        }

        try {
            return $acl->isAllowed($user->getAclRole(), $resource, $privilege);
        } catch (Exception $e) {
            try {
                if (!$acl->has($resource)) {
                    return $acl->isAllowed($user->getAclRole(), null, $privilege);
                }
            } catch (Exception $e) { }
        }
    }
    return false;
}

Mais ce qui aurait pu arriver, c'est que les rôles avaient des autorisations définies catalog, c'est-à-dire que vous n'avez pas sélectionné tous les enfants, mais la case à cocher du catalogue elle-même. Il est ensuite enregistré comme une autorisation qui compte pour tous les enfants ( catalog/*), même s'ils sont ajoutés ultérieurement.

Désolé, ce n'était pas vrai. Chaque autorisation est enregistrée séparément en plus du parent.

Fabian Schmengler
la source
Où est la logique qui autorise une seule autorisation à prendre en compte tous les enfants?
Peter O'Callaghan
J'ai vérifié à nouveau et je n'ai pas pu le trouver, il semble que ces ressources parentales n'existent que pour que vous puissiez vérifier isAllowed('catalog')- il n'autorise pas implicitement l'accès à tous les enfants. Désolé pour la désinformation!
Fabian Schmengler du