Ação de administração personalizada do Magento 2 redirecionada para o painel

18

Estou fazendo o curso de desenvolvimento dos fundamentos do Magento 2 e o exercício Admin Router / Controller parece desatualizado. O roteador funciona, mas o controlador não, sempre apenas redireciona para a página inicial do administrador. Código do aplicativo roteador / 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 o aplicativo Admin controller / 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;
    }
}

Quando eu vou para o URL de administração de admin / test / action / index, ele apenas redireciona e nada acontece. Se eu adicionar um construtor e usar o xdebug, ele mostra que atinge o construtor do controlador, mas nunca executa a parte de execução. o que estou perdendo?

Kevin Chavez
fonte
Espero que na sua função de código _isAllowed retorne true. No exemplo, instrução "return" é ausência
KAndy 1/15/15
@ KAndy sim, é, obrigado. Editou minha pergunta para mostrar isso.
Kevin Chavez

Respostas:

22

Isso acontece porque falta 'chave secreta' quando você digita o URL manualmente. Recurso de chave secreta é ativado por padrão e pode ser desativado aqui: Stores => Configuration => Advanced => Admin => Security => Add Secret Key to URLs. Então você deve conseguir alcançar sua ação.

Alex Paliarush
fonte
@ Alex Paliarush, como fazer isso funcionar quando as chaves de segurança estão ativadas.
Aswanth
@Aswanth Basta adicionar sua ação ao menu e clicar nele. Nesse caso, o Magento adicionará a chave de segurança adequada à solicitação
Alex Paliarush 4/04/16
@AlexPaliarush Obrigado Funciona para mim .. e economizou meu tempo
ZOE RULE 15/17
Esse era o problema, mas por que o curso não diz sobre essa condição no exercício? Perdi algumas horas verificando isso ... Grrrrrrr
Binod - GoFundMonica
resposta perfeita !!! +1 :) fez o meu dia
SagarPPanchal 14/02
12

No router.xmlarquivo ( companyName/customModule/etc/adminhtml/router.xml), para mim, a solução era ter o ID da rota e o frontName com o mesmo valor. No seu caso, isso seria:

<?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
fonte
Mudado <route id="Bmanager" frontName="bmanager">para <route id="bmanager" frontName="bmanager">e agora eu posso fazer um trabalho básico controlador como descrito no corpo pergunta. Ainda sem sorte com meus controladores personalizados. Edit: Na verdade, um dos meus controladores personalizados começou a dar alguns erros. Muito melhor do que redirecionar sem erros.
Adrian Moisa
4

Talvez seja melhor usar essa propriedade:

/**
 * Array of actions which can be processed without secret key validation
 *
 * @var array
 */
protected $_publicActions = ['action_name'];
Deus do Magento
fonte
2

Ao tentar acessar os módulos / funcionalidades no back-end (Adminhtml), o Magento verifica a presença do segredo Form Keys e se / quando alguém tenta acessar uma ação e não fornece uma FormKey (por exemplo: hotlinking o URL) e / ou fornece uma FormKey inválida - o Adminhtml AbstractAction (Magento \ Backend \ App \ AbstractAction) encaminhará a página de inicialização definida pelo Admin UIX do usuário (que geralmente é a página do painel)

[Esse mecanismo serve como um "ponto de verificação de segurança" para impedir que os usuários acessem partes do back-end aos quais não têm acesso]


Ao acessar opções no menu Admin UIX - o Magento adicionará automaticamente o FormKey para você.


Para impedir a verificação do FormKey, você tem duas opções:

(a) Desativar a validação do FormKey

Navegação: Lojas -> Configurações: Configuração -> Avançado: Admin -> Segurança -> Configuração "Adicionar Chave Secreta aos URLs" para "Não"

É muito importante lembrar que isso desativará a validação de chave secreta e, portanto, poderá tornar seu aplicativo vulnerável.

Como desativar a validação de FormKey

(b) Desative a Validação do FormKey para seu controlador

Especifique as ações que você deseja isentar, da verificação FormKey, no atributo "$ _publicActions" do seu Admin Controller.

protected $ _publicActions = ['ENTER_NAME_OF_ACTION'];

Exemplo de código:

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

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

}
Sharath Kumar
fonte
1

O problema do redirecionamento de roteamento com a chave de segurança ativada é o URL da ação definido no menu.xml em / 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>

O valor importante é o parâmetro de ação no item de menu. Preste atenção para definir o nome do módulo declarado no routes.xml no parâmetro id. No meu 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>
Michelangelo
fonte
0

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

mas você pode adicionar um brickpoing ao fornecedor / magento / module-backend / App / AbstractAction.php

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