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.
fuente
$session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())
Respuestas:
No pude recrear el problema en 1.13.1.0. Usé su código exacto, excepto que lo usé para cambiar el título de la página condicionalmente. Primero probé esto con un usuario que inició sesión con todos los permisos y el método isAllowed volvió verdadero. Luego creé otra función que no tenía seleccionada esta casilla de verificación, pero tenía todas las otras casillas seleccionadas y luego cerré la sesión y volví a iniciar sesión con un usuario asociado a esta nueva función y isAllowed estaba devolviendo false. Puede intentar cerrar sesión y volver a iniciarla. Si esto todavía no funciona, intente borrar su caché y sesiones y volver a iniciar sesión.
fuente
El valor predeterminado en
Mage_Admin_Model_Session
es en realidadfalse
(no tendría sentido de lo contrario):Pero lo que podría haber sucedido es que los roles tenían permisos establecidoscatalog
, es decir, no seleccionó todos los elementos secundarios individuales sino la casilla de verificación del catálogo. Luego se guarda como un permiso que cuenta para todos los hijos (catalog/*
), incluso si se agregan más tarde.Lo siento, eso no era cierto. Cada permiso se guarda por separado adicional al padre.
fuente
isAllowed('catalog')
, no permite implícitamente el acceso a todos los hijos. Perdón por la desinformación!