Angenommen, wir fügen der ACL einige neue Ressourcen hinzu:
<acl>
<resources>
<admin>
<children>
<catalog>
<children>
<search>
<children>
<import translate="title">
<title>Import</title>
</import>
<export translate="title">
<title>Export</title>
</export>
</children>
</search>
</children>
</catalog>
</children>
</admin>
</resources>
</acl>
Wir fügen dann Folgendes um eine Schaltfläche hinzu, die im SearchTerm-Raster angezeigt wird:
if (Mage::getSingleton('admin/session')->isAllowed('catalog/search/import')) {
$this->_addButton('import', array(
'label' => 'Import Search Terms',
'onclick' => "setLocation('".$this->getUrl('*/*/import')."')"
));
}
Wenn ich mich dann als Nicht-Administrator-Benutzer anmelde, hätte ich wirklich gedacht, dass das erwartete Verhalten keine Schaltfläche sichtbar ist, da ich der Benutzerrolle die Ressource nicht explizit zugewiesen habe. Wie sich jedoch herausstellt, isAllowed
scheint der Standardrückgabewert von true zu sein. Wenn Sie die Ressourcen für diese Rolle anzeigen, wird das Kontrollkästchen nicht aktiviert.
Ich kann das Problem beheben, indem ich durch jede Rolle klicke und auf Speichern klicke. Dies ist jedoch eine PITA, die insbesondere in Live- / Bühnen- / Entwicklungsumgebungen durchgeführt werden muss. Gibt es eine einfache Möglichkeit, diese Ressource automatisch über Code von jeder Rolle abzulehnen? Es macht mir nichts aus, bei Bedarf ein Migrationsskript hinzuzufügen. Ich habe mir kurz angesehen, was in derselben Aktion passiert. Vermutlich könnte ich dies tun, indem ich alle Rollen lade, sie durchlaufe und eine ähnliche Logik wie beim Mage_Admin_Model_Resource_Rules::saveRel
Einfügen der Zeilen in die Tabelle ausführe . Dieser Code scheint jedoch davon auszugehen, dass alle Ressourcen veröffentlicht sind. Um ihn direkt aufzurufen, müsste ich herausfinden, in welchem Format ich die Daten übergeben und möglicherweise auch vorhandene Ressourcen laden muss.
quelle
$session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())
Antworten:
Ich konnte das Problem in 1.13.1.0 nicht neu erstellen. Ich habe Ihren genauen Code verwendet, außer ich habe ihn verwendet, um den Titel der Seite bedingt zu ändern. Ich habe dies zuerst mit einem Benutzer getestet, der mit allen Berechtigungen angemeldet war, und die isAllowed-Methode hat true zurückgegeben. Ich habe dann eine andere Rolle erstellt, bei der dieses Kontrollkästchen nicht aktiviert war, aber alle anderen Kontrollkästchen aktiviert waren. Anschließend habe ich mich mit einem an diese neue Rolle angehängten Benutzer abgemeldet und wieder angemeldet, und isAllowed hat false zurückgegeben. Sie können versuchen, sich abzumelden und wieder anzumelden. Wenn dies immer noch nicht funktioniert, löschen Sie Ihren Cache und Ihre Sitzungen und melden Sie sich wieder an.
quelle
Der Standardwert in
Mage_Admin_Model_Session
ist tatsächlichfalse
(würde sonst keinen Sinn ergeben):Möglicherweise ist jedoch passiert, dass für die Rollen Berechtigungen festgelegt wurdencatalog
, dh, Sie haben nicht alle einzelnen untergeordneten Elemente ausgewählt, sondern das Kontrollkästchen Katalog selbst. Dann wird es als eine Berechtigung gespeichert, die für alle untergeordneten Elemente (catalog/*
) zählt, auch wenn sie später hinzugefügt werden.Entschuldigung, das stimmte nicht. Jede Berechtigung wird zusätzlich zum übergeordneten Element separat gespeichert .
quelle
isAllowed('catalog')
Es erlaubt nicht implizit den Zugriff auf alle untergeordneten Ressourcen . Entschuldigung für die Fehlinformationen!