Zugriff verweigert: Die Folgen von SUPEE-6285 und ACLs

Der letzte Magento-Patch SUPEE-6285 macht momentan die Runde. Nach der Installation im ersten Shop dann auch schon die Ernüchterung: Die Benutzer erhalten "Zugriff verweigert" statt die gewohnten Shop-Funktionalitäten.

Zugriff-Verweigert

Aber warum? Schuld ist die kleine aber feine Änderung in der Datei: app/code/core/Mage/Adminhtml/Controller/Action.php

Sprich: In der Klasse, von welcher jeder Admin-Controller erben sollte, welchen man so erstellt. Hier hat sich das Magento-Team entschlossen, nicht mehr einfach nur true zurück zu geben (was jedem Zugriff erlangt), sondern die Rechte entsprechend zu prüfen. Das ist so lange egal, wie man sich mit vollen Admin-Rechten durch den Shop bewegt. Hat man diese nicht mehr, machen sich schlampige Implementierungen der ACLs in den eigenen Modulen schnell durch die oben genannte Fehlermeldung bemerkbar.

SUPEE-6285-Adminhtml

Wie findet man heraus, ob man etwas tun muss?

Relativ einfach: Den eigenen Code einfach nach "extends Mage_Adminhtml_Controller_Action" durchsuchen. Findet man hier etwas, muss auf jeden Fall die Methode _isAllowed() überschrieben worden sein. Faule Menschen überschreiben diese nun einfach und geben true zurück. Würde ich aber generell von abraten (auch, wenn es dann maximal so unsicher ist, wie vor dem Patch). Aber warum das Ganze nicht gleich als Chance sehen, die ACLs zu korrigieren?

Zu einer sauberen ACL gehören zwei Dinge:

  • Der entsprechende Eintrag in der adminhtml.xml des eigenen Moduls
  • Die Abfrage der Rechte an den entsprechenden Stellen (u.a. in _isAllowed)

Eine saubere adminhtml.xml sieht so aus:

<?xml version="1.0"?>
<config>
    <menu>
        <my_module>
            <children>
                <some_operation module="my_module">
                    <sort_order>50</sort_order>
                    <title>Operationen durchführen</title>
                    <action>adminhtml/operation</action>
                </some_operation>
            </children>
        </my_module>
    </menu>

    <acl>
        <resources>
            <admin>
                <children>
                    <my_module>
                        <children>
                            <some_operation translate="title">
                                <title>Operationen durchführen</title>
                                <sort_order>50</sort_order>
                            </some_operation>
                        </children>
                    </my_module>
                    <system>
                        <children>
                            <config>
                                <children>
                                    <my_config_node translate="title">
                                        <title>Modulkonfiguration verändern</title>
                                    </my_config_node>
                                </children>
                            </config>
                        </children>
                    </system>
                </children>
            </admin>
        </resources>
    </acl>
</config>

In diesem Beispiel werden nicht nur die Rechte für den neuen Menueintrag richtig gesetzt, sondern auch für die Konfiguration unter System / Konfiguration (sofern vorhanden). Für Einträge unter "system" funktioniert das Rechtemanagement danach out of the Box. Alle anderen können wir danach zwar schön in den Gruppenberechtigungen anhaken, aber eben ohne Effekt. Gut, die Menueinträge verschwinden bei fehlenden Berechtigungen automatisch - aber wenn man die Route kennt, kommt man auch ohne Rechte in die Controller-Actions (unschön).

Fehlt also noch das Überschreiben der Funktion im Controller:

protected function _isAllowed()
{
    return Mage::getSingleton('admin/session')->isAllowed('admin/my_module/some_operation');
}

Und schon fertig. Tat auch gar nicht weh, oder? Etwas nervig ist das herausfinden von bestehenden Nodes. Hier wird man auch nicht sonderlich gut von Magicento unterstützt und muss sich selbst durch bestehende adminhtml.xml-Dateien aus dem Core quälen. Dauert aber trotzdem maximal 5 Minuten und ist keine Ausrede.

Was kann man mit ACLs noch so anstellen?

Es macht wenig Sinn, dem Nutzer zum Beispiel einen Button anzuzeigen, und erst wenn er drauf klickt die Meldung "Zugriff verweigert" zu liefern. Usability geht wirklich anders - und auch echt einfach. Den entsprechenden Aufruf haben wir dafür schon gesehen. Die Abfragen nach den entsprechenden Rechten kann man also schon vor dem Aufruf durchführen und blendet bei fehlenden Rechte die ganzen Buttons oder Links gar nicht mehr ein.

if(Mage::getSingleton('admin/session')->isAllowed('admin/my_module/some_operation')) {
    // Button oder Link einblenden
}

Fazit

Klar kann man argumentieren, dass eh nur vertrauenswürdige Menschen einen Admin-Zugang bekommen, aber das gibt einem noch lange nicht das Recht hier zu schludern. Ich gebe zu, dass ich das Thema in der Vergangenheit auch gerne oft links liegen lassen habe - aber ich gelobe Besserung. Zumindest das hat der Patch für mich bewirkt. Nicht der Beste Zeitpunkt für so eine Aktion seitens Magento, aber eine vernünftige.



Ein Beitrag von Matthias Kleine
Matthias's avatar

Matthias Kleine hatte Mitte 2012 die ersten Kontakte mit Magento - dies geschah durch die Anstellung bei der code-x GmbH als Softwareentwickler. Seit dem bildet er sich ständig im Bereich eCommerce fort, schreibt eigene Extensions und stellt diese gerne auch als OpenSource-Projekte auf GitHub zur Verfügung. Seit Ende 2013 wird Matthias auch im Verzeichnis der zertifizierten Magento-Entwickler gelistet. @klein0r

Alle Beiträge von Matthias

Kommentare
Magento-Neuigkeiten #42 am

[…] stopft. Phillip Jackson erläuterte, was die Patches tun, ebenso Christian Münch. Matthias Kleine erklärte, warum man in schlecht geschriebenen Modulen als Nicht-Admin-Backend-User auf einmal vor […]

Marcus am

alles klar. Allerdings gibt es auf der Magento-Seite den SUPEE-6285 nicht als Download für Magento 1.5.0.1. Sollte man für diese Version dann wohl den für Magento 1.5.1.0 wählen, oder?

Herzliche Grüße, Marcus

Matthias Kleine am

Jap, nur das Backend und nur, wenn der Benutzer kein Administrator ist, sondern eingeschränkte Rechte hat.

Marcus am

Hallo Matthias,

die ACL-Probleme betreffen aber nur das backend, oder? Im Frontend gibt es keine Probleme damit, richtig?

Grüße, Marcus

5 Dinge, die Deine Magento-Extension besser machen - Magento Blog für Entwickler und eCommerce-Shops - webguys.de Magento Blog für Entwickler und eCommerce-Shops – webguys.de am

[…] Ich weiß, das ist anstrengend und man vergisst das gerne. Allerdings ist es wirklich nützlich, wenn die Extension etwas komplexer wird und es z.B. viele Entitäten gibt. Aber auch sonst legen wir für Kunden häufig Accounts mit eingeschränkten Rechten an – dann ist es immer sehr anstrengend, wenn man die 3rd Party Extension nicht in den ACLs findet oder diese falsch implementiert sind. Dauert nur wenige Minuten das ordentlich zu machen und man wird es euch danken. Seit dem letzten Patch ist das Thema noch einmal etwas kritischer geworden – wir berichteten hier. […]

Dein Kommentar