Пользовательское действие администратора Magento 2 перенаправлено на панель инструментов

18

Я беру курс по разработке основ Magento 2, и упражнение Admin Router / Controller кажется устаревшим. Маршрутизатор работает, а контроллер - нет, он всегда просто перенаправляет на домашнюю страницу администратора. Код для приложения маршрутизатора / code / Training / Test / etc / adminhtml / rout.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>

Код для приложения контроллера Admin / 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;
    }
}

Когда я захожу на административный URL-адрес admin / test / action / index, он просто перенаправляет и ничего не происходит. Если я добавляю конструктор и использую xdebug, он показывает, что он достигает конструктора контроллера, но никогда не выполняет часть выполнения. Что мне не хватает?

Кевин Чавес
источник
Надеюсь в вашем коде функция _isAllowed вернет true. В примере инструкция возврата - отсутствие
KAndy
@ Да, да, конечно, спасибо. Отредактировал мой вопрос, чтобы показать это.
Кевин Чавес

Ответы:

22

Это происходит потому, что «секретный ключ» отсутствует, когда вы просто вводите URL вручную. Секретный ключ функция включена по умолчанию и может быть отключена здесь: Stores => Configuration => Advanced => Admin => Security => Add Secret Key to URLs. Тогда вы должны быть в состоянии достичь своих действий.

Алекс Палиаруш
источник
@ Алекс Палиаруш, как заставить это работать, когда ключи безопасности включены?
Асуант
@Aswanth Просто добавьте свое действие в меню и нажмите на него. В этом случае Magento добавит правильный ключ безопасности к запросу
Алекс Палиаруш
@AlexPaliarush Спасибо, это работает для меня .. и сэкономило мое время
ZOE
Это было проблемой, но почему курс не говорит об этом условии в упражнении? Я потерял несколько часов проверить это ... Grrrrrrr
Бинод - GoFundMonica
идеальный ответ !!! +1 :) сделал мой день
SagarPPanchal
12

В router.xmlfile ( companyName/customModule/etc/adminhtml/router.xml) Для меня решение состояло в том, чтобы идентификатор маршрута и frontName имели одно и то же значение. В вашем случае это будет:

<?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
источник
Изменено <route id="Bmanager" frontName="bmanager">на <route id="bmanager" frontName="bmanager">и теперь я могу сделать основную работу контроллера , как описано тело вопроса. Еще не повезло с моими кастомными контроллерами. Изменить: На самом деле один из моих пользовательских контроллеров начал выдавать некоторые ошибки. Гораздо лучше, чем перенаправление без ошибок.
Адриан Мойса
4

Может быть, лучше использовать это свойство:

/**
 * Array of actions which can be processed without secret key validation
 *
 * @var array
 */
protected $_publicActions = ['action_name'];
Бог Магенто
источник
2

При попытке получить доступ к модулям / функциям в бэкэнде (Adminhtml), Magento проверяет наличие секрета Form Keys, и если / когда кто-то пытается получить доступ к действию и не предоставляет FormKey (например, горячая ссылка на URL) и / или предоставляет неверный FormKey - Adminhtml AbstractAction (Magento \ Backend \ App \ AbstractAction) направит пользовательскую стартовую страницу Admin UIX пользователя (обычно это страница Dashboard)

[Этот механизм служит «контрольной точкой безопасности» для предотвращения доступа пользователей к тем частям Бэкэнда, к которым у них нет доступа]


При доступе к опциям из меню Admin UIX - Magento автоматически добавит FormKey для вас.


Чтобы предотвратить проверку FormKey, у вас есть два варианта:

(а) Отключить проверку формы ключа

Навигация: Магазины -> Настройки: Конфигурация -> Дополнительно: Администратор -> Безопасность -> Настройка «Добавить секретный ключ к URL» в «Нет»

Очень важно помнить, что это отключит проверку секретного ключа и, следовательно, может сделать ваше приложение уязвимым.

Как отключить проверку формы ключа

(б) Отключите валидацию FormKey для вашего контроллера

Укажите действия, которые вы хотите исключить из проверки FormKey, в атрибуте «$ _publicActions» вашего Admin Controller.

protected $ _publicActions = ['ENTER_NAME_OF_ACTION'];

Пример кода:

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

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

}
Шарат Кумар
источник
1

Проблема перенаправления маршрутизации с включенным ключом безопасности заключается в URL-адресе действия, заданном в файле menu.xml в / 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>

Важным значением является параметр action в пункте меню. Обратите внимание, чтобы в параметре id было указано имя модуля, объявленного в routs.xml. В моем случае: "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>
Микеланджело
источник
0

<input name="form_key" type="hidden" value="<?php echo $block->escapeHtml($block->getFormKey()) ?>" /> поможет

но вы можете добавить кирпичик в vendor / magento / module-backend / App / AbstractAction.php

if (!$_isValidFormKey || !$_isValidSecretKey) {}
Саша Осадчий
источник