Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

ACL und eigenen Menüpunkt im Admin-Backend einrichten

ACL und eigenen Menüpunkt im Admin-Backend einrichten

~6 Min. Lesezeit Zuletzt aktualisiert am 9. August 2026

Bevor überhaupt ein Controller aufgerufen werden kann, muss der Admin-Bereich wissen, welche Benutzerrolle darauf zugreifen darf und wo im Menü der Einstieg sitzt. Beides wird deklarativ konfiguriert - keine Zeile PHP-Code nötig.

acl.xml: Berechtigungen deklarieren

Jede Admin-Ressource (Menüpunkt, Controller, Formularfeld) kann an eine ACL-Resource-ID gebunden werden. Rollen im Bereich System > Berechtigungen > Benutzerrollen werden gegen genau diese IDs geprüft. Für unser Übungsmodul reicht vorerst ein einzelner Knoten:

app/code/Mironsoft/Announcement/etc/acl.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
    <acl>
        <resources>
            <resource id="Magento_Backend::admin">
                <resource id="Magento_Backend::content">
                    <resource id="Mironsoft_Announcement::announcement"
                              title="Announcements" sortOrder="50" />
                </resource>
            </resource>
        </resources>
    </acl>
</config>

Der Baum unter Magento_Backend::admin wird eins zu eins im Rollen-Editor als Checkbox-Baum dargestellt. Wo ein eigener Knoten in diesem Baum hängt, entscheidet, unter welcher Rubrik ein Admin ihn sieht - hier bewusst unter Magento_Backend::content, weil Kapitel 25 diese Struktur später für Kundenstimmen um separate Berechtigungen für Grid, Formular und Löschen erweitert.

Controller an die ACL binden

Jeder Adminhtml-Controller definiert über die Konstante ADMIN_RESOURCE, welche ACL-Resource-ID für den Zugriff nötig ist:

class Index extends \Magento\Backend\App\Action
{
    const ADMIN_RESOURCE = 'Mironsoft_Announcement::announcement';
    // ...
}

Tipp: ACL-Rechte vererben sich nach unten: Wer Zugriff auf einen übergeordneten Knoten hat, hat implizit auch Zugriff auf alle Kind-Knoten - nicht aber umgekehrt. Das ist der Grund, warum Kapitel 25 Grid, Formular und Löschen bewusst als getrennte Kind-Knoten statt als einen einzigen groben Knoten modelliert: Nur so lässt sich einer Rolle Leserecht ohne Löschrecht geben.

Eigenen Menüpunkt anlegen

Der Menüpunkt selbst kommt aus etc/adminhtml/menu.xml und verweist ebenfalls auf die ACL-Resource-ID - ist ein Benutzer für die Ressource nicht berechtigt, blendet Magento den Menüpunkt automatisch aus, ganz ohne Zusatzlogik.

app/code/Mironsoft/Announcement/etc/adminhtml/menu.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
    <menu>
        <add id="Mironsoft_Announcement::announcement"
             title="Announcements"
             module="Mironsoft_Announcement"
             sortOrder="50"
             parent="Magento_Backend::content"
             action="mironsoft_announcement/announcement/index"
             resource="Mironsoft_Announcement::announcement" />
    </menu>
</config>

Der action-Wert entspricht dem URL-Pfad des Index-Controllers: Frontname/ControllerOrdner/ActionName. Der Frontname stammt aus etc/adminhtml/routes.xml:

app/code/Mironsoft/Announcement/etc/adminhtml/routes.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="admin">
        <route id="mironsoft_announcement" frontName="mironsoft_announcement">
            <module name="Mironsoft_Announcement" />
        </route>
    </router>
</config>

Änderungen sichtbar machen

bin/magento cache:clean
bin/magento cache:flush

Achtung: ACL- und Menü-Änderungen landen in stark gecachten Bereichen (config- und layout-Cache). Ein reines cache:clean reicht manchmal nicht aus, wenn der neue Menüpunkt partout nicht erscheint - dann hilft zusätzlich ein Logout/Login im Admin, da die Menüstruktur teilweise session-gebunden aufgebaut wird. Kapitel 26 geht auf dieses und ähnliche Cache-Symptome noch einmal im Detail ein.

Damit ist das Grundgerüst komplett: Modul, Tabelle, Model-Trias, ACL und Menüpunkt. Block 2 baut darauf den ersten Grid.