Magento 2 Спеціальна дія адміністратора перенаправлена ​​на панель приладів


18

Я беру курс на розробку основ Magento 2, і вправа маршрутизатора / контролера адміністратора здається застарілою. Роутер працює, але контролер цього не робить, він завжди просто перенаправляє на головну сторінку адміністратора. Код програми / коду маршрутизатора / Навчання / Тест / тощо / adminhtml / route.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>

Код програми / код контролера адміністратора / Навчання / Тест / Контролер / Adminhtml / Дія / 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 return true. Наприклад, інструкція "return" - це відсутність
KAndy,

@KAndy так, але спасибі. Відредагував моє запитання, щоб показати це.
Кевін Чавес

Відповіді:


22

Це відбувається тому, що "секретний ключ" відсутній, коли ви просто вводите URL-адресу вручну. Секретний ключ функція включена за замовчуванням і може бути відключена тут: Stores => Configuration => Advanced => Admin => Security => Add Secret Key to URLs. Тоді ви повинні мати можливість дійти до вашої дії.


@ Алекс Паліяруш, як зробити цю роботу, коли активовані ключі безпеки.?
Асуант

@Aswanth Просто додайте свою дію до меню та натисніть на неї. У цьому випадку Magento додасть належний ключ безпеки до запиту
Alex Paliarush

@AlexPaliarush Спасибі Це працює на мене .. і заощадив мій час
РОЗДІЛ ЗОЕ

Це була проблема, але чому в курсі цього курсу не сказати про цей стан? Я втратив кілька годин перевірити це ... Grrrrrrr
Бінод - GoFundMonica

ідеальна відповідь !!! +1 :) зробив свій день
SagarPPanchal

12

У router.xmlфайлі ( 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>

Змінено <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) буде направляти визначену стартову сторінку користувача адміністратора UIX (яка зазвичай є сторінкою панелі інструментів)

[Цей механізм служить "контрольною точкою безпеки", щоб запобігти доступу користувачів до частин Backend, до яких вони не мають доступу]


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


Щоб запобігти чеку на FormKey, у вас є два варіанти:

(a) Вимкніть перевірку FormKey

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

Дуже важливо пам’ятати, що це призведе до вимкнення перевірки секретного ключа, а тому може зробити вашу програму вразливою.

Як вимкнути перевірку FormKey

(b) Вимкніть перевірку FormKey для свого контролера

Вкажіть дії, які ви бажаєте вилучити, з чека FormKey, в атрибуті "$ _publicActions" вашого контролера адміністратора.

захищені $ _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>

Важливим значенням є параметр дії в пункті меню. Зверніть увагу, щоб встановити ім'я модуля, оголошеного в route.xml, в параметр id. У моєму випадку: "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()) ?>" /> допоможе

але ви можете додати цегляну кладку до постачальника / magento / module-backend / App / AbstractAction.php

if (!$_isValidFormKey || !$_isValidSecretKey) {}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.