Magento ACL: Kein “Ausloggen und wieder einloggen” mehr nach Extension-Installation

In fast jeden Installationsanweisungen für Magento Extensions findet man den Schritt “Ausloggen und wieder einloggen”, der notwendig ist um Zugriff auf neue Bereiche im Admin Menü oder der Systemkonfiguration zu erhalten. Aber warum müssen wir das hinnehmen? Das Problem ist, dass die Access Control List (ACL) nur bei Login geladen wird und dann in der Session gecached bleibt. Sie bei jedem Zugriff zu laden ist keine brauchbare Alternative, das würde das Backend zu sehr verlangsamen.

Aber mit nur wenigen Zeilen Code können wir das Neuladen der ACL ein wenig komfortabler gestalten:

Der Code

Diese Controller Action lädt die ACL auf Anfrage neu:

class SSE_AclReload_Adminhtml_Permissions_AclReloadController
    extends Mage_Adminhtml_Controller_Action
{
    public function indexAction()
    {
        $session = Mage::getSingleton('admin/session');
        $session->setAcl(Mage::getResourceModel('admin/acl')->loadAcl());

        Mage::getSingleton('adminhtml/session')->addSuccess(
            $this->__('ACL reloaded'));
        $this->_redirectReferer();
    }
}

Dieses Template stellt einen Button zur Verfügung, der zu dem neuen Controller linkt:

<?php
$request = Mage::app()->getRequest();
?>
<a href="<?php echo $this->getUrl('adminhtml/permissions_aclReload/index'); ?>">
<?php echo $this->__('Reload ACL'); ?>
</a>

Und dieses Layout Update fügt den Button zu “404” Fehlerseiten im Backend hinzu (die, die man sieht, wenn man keinen Zugriff auf eine Seite hat):

    <adminhtml_noroute>
        <reference name="content">
            <block type="adminhtml/template" name="content.aclReload"
                after="content.noRoute" template="sse_aclreload/button.phtml" />
        </reference>
    </adminhtml_noroute>

Das Ergebnis

Screenshot Magento Admin 404

Ich habe es als Extension auf GitHub zusammengestellt:

https://github.com/schmengler/AclReload

Sie fügt außerdem einen Menüpunkt unterhalb des “System” > “Berechtigungen” Untermenüs hinzu:

Screenshot Magento ACL Reload

Installation

Die empfohlene Installation-Methode ist via Composer, fügt dazu folgendes zu eurer composer.json hinzu:

    "repositories": [
        {
            "type": "git",
            "url": "https://github.com/schmengler/AclReload.git"
        }
    }
    "require": {
        "sse/aclreload": ">=0.1.1"
    }

Aber man kann auch nur das Repository herunterladen und alles aus src/app ins app Verzeichnis seiner Magento Installation kopieren.

Danke

Danke an Marius Strajeru für die Idee in seiner Antwort auf diese StackExchange Frage.

James Anelay hat die Technik mit diesem Snippet für eigene Extensions noch etwas weitergetrieben: Ladet die ACL in einem Observer vor dem Dispatching der Systemkonfiguration neu, falls die aktuelle Sektion nicht erlaubt ist (also man normalerweise die 404 Seite sehen würde). Das selbe kann in einer preDispatch Methode in eigenen Admin Controllers angewendet werden.