Recurso de rol de ACL predeterminado

8

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 isAllowedparece 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::saveRelinserció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.

Peter O'Callaghan
fuente
No estoy seguro de que esté usando 'isAllowed' correctamente, ¿no debería ser esto? $session->isAllowed($session->getData('acl')->get('catalog/search/import')->getResourceId())
Benubird
Me parece un error
Fabian Blechschmidt

Respuestas:

2

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.

Jonathan Hodges
fuente
0

El valor predeterminado en Mage_Admin_Model_Sessiones en realidad false(no tendría sentido de lo contrario):

public function isAllowed($resource, $privilege = null)
{
    $user = $this->getUser();
    $acl = $this->getAcl();

    if ($user && $acl) {
        if (!preg_match('/^admin/', $resource)) {
            $resource = 'admin/' . $resource;
        }

        try {
            return $acl->isAllowed($user->getAclRole(), $resource, $privilege);
        } catch (Exception $e) {
            try {
                if (!$acl->has($resource)) {
                    return $acl->isAllowed($user->getAclRole(), null, $privilege);
                }
            } catch (Exception $e) { }
        }
    }
    return false;
}

Pero lo que podría haber sucedido es que los roles tenían permisos establecidos catalog, 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.

Fabian Schmengler
fuente
¿Dónde está la lógica que permite un permiso para dar cuenta de todos los niños?
Peter O'Callaghan
Revisé nuevamente y no pude encontrarlo, parece que estos recursos primarios solo existen para que pueda verificarlo isAllowed('catalog'), no permite implícitamente el acceso a todos los hijos. Perdón por la desinformación!
Fabian Schmengler