Acción de administración personalizada de Magento 2 redirigida al panel

18

Estoy tomando el curso de desarrollo de fundamentos de Magento 2 y el ejercicio Admin Router / Controller parece desactualizado. El enrutador funciona, pero el controlador no, siempre se redirige a la página de inicio del administrador. Código para la aplicación del enrutador / code / Training / Test / etc / adminhtml / routes.xml :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/framework/App/etc/routes.xsd">
<router id="admin">
    <route id="test" frontName="test">
        <module name="Training_Test" before="Magento_Backend" />
    </route>
</router>
</config>

Código para la aplicación del controlador de administración / code / Training / Test / Controller / Adminhtml / Action / Index.php :

<?php

namespace Training\Test\Controller\Adminhtml\Action;
class Index extends \Magento\Backend\App\Action
{

public function execute()
    {
    die("test reached controller");
    }
protected function _isAllowed() {
    return true;
    }
}

Cuando voy a la URL de administración de admin / test / action / index, simplemente se redirige y no sucede nada. Si agrego un constructor y uso xdebug, muestra que llega al constructor del controlador, pero nunca hace la parte de ejecución. ¿Qué me estoy perdiendo?

Kevin Chavez
fuente
Espero que en su función de código _isAllowed return true En el ejemplo, la instrucción de "retorno" es ausencia
KAndy
@KAndy sí, gracias. Edité mi pregunta para mostrar eso.
Kevin Chavez el

Respuestas:

22

Esto sucede porque falta la 'clave secreta' cuando escribe la URL manualmente. Característica clave secreta está activada de forma predeterminada y se puede desactivar aquí: Stores => Configuration => Advanced => Admin => Security => Add Secret Key to URLs. Entonces deberías poder alcanzar tu acción.

Alex Paliarush
fuente
@Alex Paliarush, ¿cómo hacer que esto funcione cuando las claves de seguridad están habilitadas?
Aswanth
@Aswanth Simplemente agregue su acción al menú y haga clic en ella. En este caso, Magento agregará la clave de seguridad adecuada a la solicitud
Alex Paliarush el
@AlexPaliarush Gracias Funciona para mí ... y ahorró mi tiempo
ZOE RULE
Este fue el problema, pero ¿por qué el curso no dice acerca de esta condición en el ejercicio? Perdí algunas horas revisando esto ... Grrrrrrr
Binod - GoFundMonica
¡¡¡Respuesta perfecta!!! +1 :) me
alegró el
12

En el router.xmlarchivo ( companyName/customModule/etc/adminhtml/router.xml) Para mí, la solución era hacer que la identificación de la ruta y el nombre frontal tengan el mismo valor. En su caso esto sería:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
    <router id="admin">
        <route id="asw_advanved" frontName="asw_advanved">
            <module name="Asw_Sample" before="Magento_Backend"/>
        </route>
    </router>
</config>
Sankar_k
fuente
Cambié <route id="Bmanager" frontName="bmanager">a <route id="bmanager" frontName="bmanager">y ahora puedo hacer que un controlador básico funcione como se describe en el cuerpo de la pregunta. Todavía no tuve suerte con mis controladores personalizados. Editar: en realidad, uno de mis controladores personalizados comenzó a dar algunos errores. Mucho mejor que redirigir sin errores.
Adrian Moisa
4

Quizás sea mejor usar esa propiedad:

/**
 * Array of actions which can be processed without secret key validation
 *
 * @var array
 */
protected $_publicActions = ['action_name'];
Dios de magento
fuente
2

Al intentar acceder a los módulos / funciones en el backend (Adminhtml), Magento comprueba la presencia del secreto Form Keys, y si / cuando alguien intenta acceder a una acción y no proporciona una FormKey (p. Ej .: vincular la URL) y / o proporciona una clave de formulario no válida: Adminhtml AbstractAction (Magento \ Backend \ App \ AbstractAction) enrutará la página de inicio definida por el usuario Admin UIX (que generalmente es la página del panel)

[Este mecanismo sirve como un "punto de control de seguridad" para evitar que los usuarios accedan a partes del Backend a las que no tienen acceso]


Al acceder a las opciones desde el menú Admin UIX, Magento agregará automáticamente la FormKey por usted.


Para evitar la verificación de FormKey, tiene dos opciones:

(a) Desactive Validación de FormKey

Navegación: Tiendas -> Configuración: Configuración -> Avanzado: Administrador -> Seguridad -> Configuración "Agregar clave secreta a URL" a "No"

Es muy importante recordar que hacerlo desactivará la Validación de clave secreta y, por lo tanto, puede hacer que su aplicación sea vulnerable.

Cómo desactivar la validación de FormKey

(b) Desactive Validación de FormKey para su controlador

Especifique las acciones que desea eximir, de la verificación FormKey, en el atributo "$ _publicActions" de su controlador de administración.

protected $ _publicActions = ['ENTER_NAME_OF_ACTION'];

Ejemplo de código:

class Index extends \Magento\Backend\App\Action
{
    protected $_publicActions = ['index'];

    public function execute()
    {
        echo "My Hello World! Controller";
    }

}
Sharath Kumar
fuente
1

El problema de la redirección de enrutamiento con la clave de seguridad habilitada es la acción url establecida en menu.xml en / etc / adminhtml /

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
    <menu>
        <add id="Mycompany_Mymodule::top_level" module="Mycompany_Mymodule" resource="Magento_Backend::content" sortOrder="9999" title="My Module" parent="Magento_Sales::sales"/>
        <add action="mycompany_mymodule/profile/index" id="Mycompany::mycompany_mymodule_profile" module="mycompany_Mymodule" parent="Mycompany_Mymodule::top_level" resource="Magento_Backend::content" sortOrder="9999" title="My Module"/>
    </menu>
</config>

El valor importante es el parámetro de acción en el elemento del menú. Preste atención para establecer el nombre del módulo declarado en routes.xml en el parámetro id. En mi caso: "mycompany_mymodule"

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="admin">
        <route frontName="mymodule" id="mycompany_mymodule">
            <module before="Magento_Backend" name="Mycompany_Mymodule"/>
        </route>
    </router>
</config>
Miguel Ángel
fuente
0

<input name="form_key" type="hidden" value="<?php echo $block->escapeHtml($block->getFormKey()) ?>" /> ayudará

pero podría agregar un brickpoing a vendor / magento / module-backend / App / AbstractAction.php

if (!$_isValidFormKey || !$_isValidSecretKey) {}
Саша Осадчий
fuente