Action d'administration personnalisée de Magento 2 redirigée vers le tableau de bord

18

Je prends le cours de développement des bases de Magento 2 et l'exercice Admin Router / Controller semble obsolète. Le routeur fonctionne, mais pas le contrôleur, il réachemine toujours vers la page d'accueil d'administration. Code pour l' application routeur / 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>

Code pour l' application du contrôleur 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;
    }
}

Lorsque je vais dans l'url d'administration de admin / test / action / index, il ne fait que rediriger et rien ne se passe. Si j'ajoute un constructeur et utilise xdebug, cela montre qu'il atteint le constructeur du contrôleur, mais il ne fait jamais la partie d'exécution. Qu'est-ce que je rate?

Kevin Chavez
la source
J'espère que dans votre fonction de code, _isAllowed retourne vrai. Dans l'exemple, l'instruction "retour" est une absence
KAndy
@KAndy oui, merci. Modifié ma question pour le montrer.
Kevin Chavez

Réponses:

22

Cela se produit car la «clé secrète» est manquante lorsque vous saisissez simplement l'URL manuellement. Fonction clé secrète est activée par défaut et peut être désactivé ici: Stores => Configuration => Advanced => Admin => Security => Add Secret Key to URLs. Vous devriez alors pouvoir atteindre votre action.

Alex Paliarush
la source
@Alex Paliarush, comment faire fonctionner cela lorsque les clés de sécurité sont activées.?
Aswanth
@Aswanth Ajoutez simplement votre action au menu et cliquez dessus. Dans ce cas, Magento ajoutera la clé de sécurité appropriée à la demande
Alex Paliarush
@AlexPaliarush Thanks Cela fonctionne pour moi .. et a sauvé mon temps
ZOE RULE
C'était le problème, mais pourquoi le cours ne parle-t-il pas de cette condition dans l'exercice? J'ai perdu quelques heures à vérifier ça ... Grrrrrrr
Binod - GoFundMonica
réponse parfaite !!! +1 :) a fait ma journée
SagarPPanchal
12

Dans le router.xmlfichier ( companyName/customModule/etc/adminhtml/router.xml) Pour moi, la solution consistait à avoir l'id de l'itinéraire et frontName la même valeur. Dans votre cas, ce serait:

<?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
la source
Changé <route id="Bmanager" frontName="bmanager">en <route id="bmanager" frontName="bmanager">et maintenant je peux faire fonctionner un contrôleur de base comme décrit le corps de la question. Toujours pas de chance avec mes contrôleurs personnalisés. Edit: En fait, l'un de mes contrôleurs personnalisés a commencé à donner des erreurs. Bien mieux que de rediriger sans erorrs.
Adrian Moisa
4

Il est peut-être préférable d'utiliser cette propriété:

/**
 * Array of actions which can be processed without secret key validation
 *
 * @var array
 */
protected $_publicActions = ['action_name'];
Dieu de Magento
la source
2

Lors de la tentative d'accès aux modules / fonctionnalités dans le backend (Adminhtml), Magento vérifie la présence du secret Form Keys , et si / quand quelqu'un tente d'accéder à une action et ne fournit pas de FormKey (par exemple: hotlinking l'url) et / ou fournit une clé de formulaire non valide - l'Adminhtml AbstractAction (Magento \ Backend \ App \ AbstractAction) acheminera la page de démarrage définie par l'utilisateur Admin UIX (qui est généralement la page du tableau de bord)

[Ce mécanisme sert de «point de contrôle de sécurité» pour empêcher les utilisateurs d'accéder à des parties du backend auxquelles ils n'ont pas accès]


Lorsque vous accédez aux options du menu Admin UIX - Magento ajoute automatiquement la FormKey pour vous.


Pour empêcher la vérification de FormKey, vous avez deux options:

(a) Désactiver la validation FormKey

Navigation: Magasins -> Paramètres: Configuration -> Avancé: Admin -> Sécurité -> Configuration "Ajouter une clé secrète aux URL" à "Non"

Il est très important de se rappeler que cela désactivera la validation de la clé secrète et peut donc rendre votre application vulnérable.

Comment désactiver la validation FormKey

(b) Désactivez la validation FormKey pour votre contrôleur

Spécifiez les actions que vous souhaitez exempter, de la vérification FormKey, dans l'attribut "$ _publicActions" de votre contrôleur d'administration.

protected $ _publicActions = ['ENTER_NAME_OF_ACTION'];

Exemple de code:

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

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

}
Sharath Kumar
la source
1

Le problème de la redirection de routage avec la clé de sécurité activée est l'URL d'action définie dans le menu.xml sous / 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>

La valeur importante est le paramètre d'action dans l'élément de menu. Faites attention à définir le nom du module déclaré dans routes.xml dans le paramètre id. Dans mon cas: "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>
Michel-Ange
la source
0

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

mais vous pouvez ajouter un brickpoing à vendor / magento / module-backend / App / AbstractAction.php

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