Digamos que agregamos algunos recursos nuevos a la ACL de esta manera:
<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>
Luego agregamos lo siguiente alrededor de un botón que aparece en la cuadrícula SearchTerm:
if (Mage::getSingleton('admin/session')->isAllowed('catalog/search/import')) {
$this->_addButton('import', array(
'label' => 'Import Search Terms',
'onclick' => "setLocation('".$this->getUrl('*/*/import')."')"
));
}
Si luego inicio sesión como usuario no administrador, realmente habría pensado que el comportamiento esperado no sería visible en ningún botón, ya que no le he dado explícitamente a los usuarios el recurso. Sin embargo, como resultado, el valor de retorno predeterminado de isAllowed
parece ser verdadero. Para complicar las cosas, cuando vaya y vea los recursos para ese rol, la casilla de verificación no aparecerá marcada.
Puedo resolver el 'problema' haciendo clic en cada rol y haciendo clic en guardar, pero esto es un PITA que se debe hacer especialmente en entornos en vivo / etapa / desarrollo. ¿Hay alguna manera fácil de negar automáticamente este recurso de cada rol a través del código? No me importa agregar un script de migración si es necesario. Eché un vistazo rápido a lo que sucede en la misma acción. Presumiblemente, podría hacer esto al cargar todos los roles, recorrerlos y realizar una lógica similar a la Mage_Admin_Model_Resource_Rules::saveRel
inserción de las filas en la tabla. Pero este código parece suponer que todos los recursos están publicados, lo que significaría que para invocarlo directamente necesitaría determinar en qué formato necesito pasar los datos y posiblemente cargar los recursos existentes también.
$session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())