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:
<?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.
<?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:
<?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:flushAchtung: 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.