Standard für ACL-Rollenressourcen

8

Angenommen, wir fügen der ACL einige neue Ressourcen hinzu:

<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>

Wir fügen dann Folgendes um eine Schaltfläche hinzu, die im SearchTerm-Raster angezeigt wird:

if (Mage::getSingleton('admin/session')->isAllowed('catalog/search/import')) {
    $this->_addButton('import', array(
        'label'   => 'Import Search Terms',
        'onclick' => "setLocation('".$this->getUrl('*/*/import')."')"
    ));
}

Wenn ich mich dann als Nicht-Administrator-Benutzer anmelde, hätte ich wirklich gedacht, dass das erwartete Verhalten keine Schaltfläche sichtbar ist, da ich der Benutzerrolle die Ressource nicht explizit zugewiesen habe. Wie sich jedoch herausstellt, isAllowedscheint der Standardrückgabewert von true zu sein. Wenn Sie die Ressourcen für diese Rolle anzeigen, wird das Kontrollkästchen nicht aktiviert.

Ich kann das Problem beheben, indem ich durch jede Rolle klicke und auf Speichern klicke. Dies ist jedoch eine PITA, die insbesondere in Live- / Bühnen- / Entwicklungsumgebungen durchgeführt werden muss. Gibt es eine einfache Möglichkeit, diese Ressource automatisch über Code von jeder Rolle abzulehnen? Es macht mir nichts aus, bei Bedarf ein Migrationsskript hinzuzufügen. Ich habe mir kurz angesehen, was in derselben Aktion passiert. Vermutlich könnte ich dies tun, indem ich alle Rollen lade, sie durchlaufe und eine ähnliche Logik wie beim Mage_Admin_Model_Resource_Rules::saveRelEinfügen der Zeilen in die Tabelle ausführe . Dieser Code scheint jedoch davon auszugehen, dass alle Ressourcen veröffentlicht sind. Um ihn direkt aufzurufen, müsste ich herausfinden, in welchem ​​Format ich die Daten übergeben und möglicherweise auch vorhandene Ressourcen laden muss.

Peter O'Callaghan
quelle
Sie sind sich nicht sicher, ob Sie 'isAllowed' richtig verwenden - sollte es nicht so sein? $session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())
Benubird
Scheint mir ein Fehler zu sein
Fabian Blechschmidt

Antworten:

2

Ich konnte das Problem in 1.13.1.0 nicht neu erstellen. Ich habe Ihren genauen Code verwendet, außer ich habe ihn verwendet, um den Titel der Seite bedingt zu ändern. Ich habe dies zuerst mit einem Benutzer getestet, der mit allen Berechtigungen angemeldet war, und die isAllowed-Methode hat true zurückgegeben. Ich habe dann eine andere Rolle erstellt, bei der dieses Kontrollkästchen nicht aktiviert war, aber alle anderen Kontrollkästchen aktiviert waren. Anschließend habe ich mich mit einem an diese neue Rolle angehängten Benutzer abgemeldet und wieder angemeldet, und isAllowed hat false zurückgegeben. Sie können versuchen, sich abzumelden und wieder anzumelden. Wenn dies immer noch nicht funktioniert, löschen Sie Ihren Cache und Ihre Sitzungen und melden Sie sich wieder an.

Jonathan Hodges
quelle
0

Der Standardwert in Mage_Admin_Model_Sessionist tatsächlich false(würde sonst keinen Sinn ergeben):

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;
}

Möglicherweise ist jedoch passiert, dass für die Rollen Berechtigungen festgelegt wurden catalog, dh, Sie haben nicht alle einzelnen untergeordneten Elemente ausgewählt, sondern das Kontrollkästchen Katalog selbst. Dann wird es als eine Berechtigung gespeichert, die für alle untergeordneten Elemente ( catalog/*) zählt, auch wenn sie später hinzugefügt werden.

Entschuldigung, das stimmte nicht. Jede Berechtigung wird zusätzlich zum übergeordneten Element separat gespeichert .

Fabian Schmengler
quelle
Wo ist die Logik, die es einer Berechtigung erlaubt, alle Kinder zu berücksichtigen?
Peter O'Callaghan
Ich habe es erneut überprüft und konnte es nicht finden. Es sieht so aus, als ob diese übergeordneten Ressourcen nur vorhanden sind, damit Sie nachsehen können. isAllowed('catalog')Es erlaubt nicht implizit den Zugriff auf alle untergeordneten Ressourcen . Entschuldigung für die Fehlinformationen!
Fabian Schmengler