SMARTY: "acl_is_allowed" greift nicht immer / Ein/Ausblenden von Elementen via Rechte im Backend

Hallo liebe Community,

kann das hier jemand von euch auch nachstellen und kann mir vllt. jemand bei der Fehlersuche / behebung behilflich sein?

Siehe: https://issues.shopware.com/issues/SW-21868

Kurzgesagt:
Wenn ich im Backend einem Nutzer das Recht “read” unter “customerstream” (über die Benutzerverwaltung) entziehe wird bei mir (auch nach Cache leeren, sowohl mehrfach als auch via FTP und erneutem Login mit dem nutzer der das Recht nicht haben soll) weiterhin der Reiter “Customer Streams” im Dialog “Kunden” im Shopware Backend angezeigt, obwohl dies nicht sein sollte (für den betreffenden Nutzer, der das Recht dazu NICHT hat). Siehe auch:

Ich habe generell das Problem dass die Smarty acl-Abfragen bei mir im Backend in verschiedenen Templates, wie z.b. in diesem CORE Template an verschiedenen Stellen NICHT greifen bzw. IMMER “True” zurückliefern. …ich habe das Gefühl dass hier die zugrundeliegende ZEND_ACL ggf. nicht (mehr?!) immer korrekt funktioniert?!

Es ging zumindest mal denke ich, sonst wären diese Abfragen ja nicht im Core bzw. hier mal diskutiert worden, siehe auch:
https://forum.shopware.com/discussion/comment/93269/#Comment_93269 (ist allerdings schon 4 Jahre her)

Wäre toll, wenn das der ein oder andere anhand der Rechte auch mal nachspielen könnte und mir mitteilt, ob das bei Ihm auch auftritt oder nicht und unter welcher Umgebung.

Meine Umgebung:

  • Shopware 5.4.2 frische Installation, ohne custom Plugins
  • Firefox neuste Version
  • PHP 7.1

Ich würde vermuten, dass in der s_core_menu der Controllername nicht mit dem Namen der customerstream-resource übereinstimmt. Am besten mal prüfen und im Zweifel mal eine Resource in lowercase anlegen, mit dem Namen des Controllers aus der s_core_menu. Wenn da keiner hinterlegt ist, wird der Menüpunkt auch nicht ausgeblendet. Vielleicht mal testweise einen hinterlegen. Da das kein eigenes Modul ist, sondern das Kundenmodul, wird das wohl die Ursache sein.

Der Zugriff wird ja aktuell schon unterbunden, dass funktionierte bei mir.

Lieber Moritz,

zunächst einmal vielen Dank dass du dir die Zeit nimmst und versuchst zu helfen!

Also ich habe das in der Datenbank überprüft. In der s_core_menü steht für den Eintrag mit dem Namen “Customer Streams” in der Spalte “Controller” der Wert: Customer.
Meine Ressource im Backend bzw. in der s_core_acl_resources heißt jedoch: customerstream

Ich bin bei der Ermittlung des Controllers wie hier beschrieben vorgegangen:

Demnach stimmen die beiden Werte wie von dir beschrieben zwar NICHT überein, aber aus meiner Sicht dürfte dies aber dennoch korrekt sein, denn:
Ich kann in der s_core_acl_resources keinen weiteren Eintrag mit dem Namen “customer” anlegen, denn den gibt es ja bereits - Das würde sonst zu einem fehler führen.

Im Backend habe ich das Recht der Ressource NICHT angehakt, read (darunter) ebenso nicht. Wenn ich dies mache (die Ressource nicht zuweisen, so wie in der Doku (link) auch beschrieben) dann erhalte ich im Backend nach dem Login bzw. spätestens beim Klick auf “Kunden” noch weitere Probleme und zwar derart, dass ich dann eine Fehlermeldung bekomme und das Plugin garnicht erst öffnen kann.

Die Fehlermeldung wird dann vom Modul “Shopware.apps” geworfen mit der Meldung:

    Permission denied in engine/Shopware/Plugins/Default/Backend/Auth/Bootstrap.php on line 254

    Stack trace:
    
        #0 engine/Shopware/Plugins/Default/Backend/Auth/Bootstrap.php(207): Shopware_Plugins_Backend_Auth_Bootstrap->checkAuth()
#1 engine/Library/Enlight/Event/Handler/Plugin.php(149): Shopware_Plugins_Backend_Auth_Bootstrap->onPreDispatchBackend(Object(Enlight_Controller_ActionEventArgs))
#2 engine/Library/Enlight/Event/EventManager.php(220): Enlight_Event_Handler_Plugin->execute(Object(Enlight_Controller_ActionEventArgs))
#3 engine/Library/Enlight/Controller/Action.php(171): Enlight_Event_EventManager->notify('Enlight_Control...', Object(Enlight_Controller_ActionEventArgs))
#4 engine/Library/Enlight/Controller/Dispatcher/Default.php(549): Enlight_Controller_Action->dispatch('indexAction')
#5 engine/Library/Enlight/Controller/Front.php(222): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp))
#6 engine/Shopware/Kernel.php(215): Enlight_Controller_Front->dispatch()
#7 vendor/symfony/http-kernel/HttpCache/HttpCache.php(486): Shopware\Kernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#8 engine/Shopware/Components/HttpCache/AppCache.php(268): Symfony\Component\HttpKernel\HttpCache\HttpCache->forward(Object(Symfony\Component\HttpFoundation\Request), true, NULL)
#9 vendor/symfony/http-kernel/HttpCache/HttpCache.php(253): Shopware\Components\HttpCache\AppCache->forward(Object(Symfony\Component\HttpFoundation\Request), true)
#10 engine/Shopware/Components/HttpCache/AppCache.php(105): Symfony\Component\HttpKernel\HttpCache\HttpCache->pass(Object(Symfony\Component\HttpFoundation\Request), true)
#11 shopware.php(122): Shopware\Components\HttpCache\AppCache->handle(Object(Symfony\Component\HttpFoundation\Request))
#12 {main}

Diese Meldung ist ja auch durchaus korrekt bzw. Logisch, da ich ja das Recht zur Ressource komplett entfernt habe.

Was ich aber eigentlich an dieser Stelle erwarte ist, dass der Nutzer (mit dem fehlenden Recht für den Reiter “Customer Streams”) durchaus das Plugin “Kunden” öffnen kann, dieser dann aber nur noch den Reiter “Kundenübersicht” ohne den Reiter “Customer Streams” angezeigt bekommt.

**Im Plugin (**shopware/window.js at 56df57575909854d2dec7fcba07500e27a3361ee · shopware/shopware · GitHub) wird nach meinem Verständniss ja genau das auch abgefragt, aber es funktioniert einfach nicht.

Auch an anderen Stellen klappt es nicht, dazu noch zwei Beispiele:

1 Beispiel: Ich habe ein eigenes Privileg “showimagetab” unter der resource “article” angelegt, welches ich dem nutzer auch NICHT zugeweisen habe.
Ziel ist es, den Tab Bilder im Dialog Artikel auszublenden. Hierzu habe ich das ExtJs Template “Shopware.apps.Article.view.detail.Window” mittels override überschrieben (das klappt soweit auch), allerdings klappt die hierin enthaltene nachfolgende abfrage ebensowenig wie das core beispiel (s.o):

        /*{if {acl_is_allowed resource=article privilege=showimagetab}}*/
        tabItemsCustom.push(me.imageTab);
        /*{/if}*/

 

Beispiel 2: Im Backend gibt es den Menüpunkt “Artikel” > “Product-Streams”. Diesen Untermenüpunkt “Product-Streams” würde ich ebenfalls gerne für eine bestimmte Rolle ausblenden. Der Controller hierzu lautet “ProductStream” -> lowercased ist dieser entsprechend als resource hinterlegt. Wenn ich diese Resource der entsprechenden Rolle nicht zuweise (haken setze) dann erhalte ich direkt beim Laden des Backends (nach dem Login) ebenfalls Fehlermeldungen (Persmisson denied), da anscheinend beim Aufruf des Backends der Controller “Product Streams” immer im Hintergrund auch schon geladen wird (werden muss). Schade. ich würde hier einfach gerne den Menüpunkt ausblenden, der Controller darf meinetwegen ja weiter geladen werden, aber so funktioniert es auch hier nicht.

Wichtiger ist mir aber eigentlich das Smarty / acl_is_allowed Problem bzw. die Frage, warum das nicht greifen will bzw. immer true zurückliefert, in den genannten Beispielfällen…

Danke für jegliche weitere Unterstützung!

Es geht dir um den Menüpunkt im Backend? Wenn als Controller in der s_core_menu “customer” steht, kann man den nur über die customer-Resource ausblenden. Der Reiter im Backendmodul wird bei mir einwandfrei ausgeblendet - wenn ich das Kundenmodul habe, ist der Reiter der CustomerStreams nicht zu sehen, wenn ich die Rechte dafür entziehe (alle Haken raus, auch aus dem Ordner-Symbol). Der Menüpunkt bleibt sichtbar, da das Modul halt “technisch” nicht CustomerStream ist, sondern Customer. Den Menüpunkt bekommt man daher aktuell nur über Customer ausgeblendet. Das Tab ausblenden, läuft bei mir aber.

Für alles andere wirst du ein Core-Ticket aufmachen müssen, das kann man sich dann ggf. einmal bei einem kommenden Release ansehen. Aktuell halt einfach nicht möglich.

Ich habe leider heute auch Fehler beim ACL festgestellt. Ganz einfacher Test: Der Resource „category“ das Recht „delete“ entziehen und der Löschen-Button (und auch die dahinterliegende Funktion) der Kategorie-Löschung funktionieren weiterhin. Ich habe auch mal debugged und dort wird immer eine 1 zurückgegeben, für die Resource. 

Hallo [@Joscha Schultze](http://forum.shopware.com/profile/21625/Joscha Schultze “Joscha Schultze”)‍

das klingt analog meinem Problem. Ich sehe das auch so, dass es ein Core Bug ist und kann das analog zu dir nachstellen.

Einen ISSUE hierzu habe ich unter Shopware Issuetracker eröffnet.

Bitte ergänze hier doch eine Erfahrungen als Kommentar und Vote für den Issue.

Vllt. bekommt das ganze dann ja bald eine gewisse Prio ([@Moritz Naczenski](http://forum.shopware.com/profile/14574/Moritz Naczenski “Moritz Naczenski”)‍ )…?

Danke!