Azione amministratore personalizzato Magento 2 reindirizzata alla dashboard


18

Sto seguendo il corso di sviluppo dei fondamentali di Magento 2 e l'esercizio Admin Router / Controller sembra obsoleto. Il router funziona, ma il controller no, reindirizza sempre alla home page dell'amministratore. Codice per l' app router / codice / Formazione / Test / etc / 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>

Codice per l' app del controller di amministrazione / codice / Formazione / Test / Controller / Adminhtml / Azione / 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 vado all'URL di amministrazione di admin / test / action / index reindirizza e non succede nulla. Se aggiungo un costruttore e utilizzo xdebug, questo mostra che raggiunge il costruttore del controller, ma non esegue mai la parte di esecuzione. Cosa mi sto perdendo?


Spero nella tua funzione di codice _è Consentito ritorno vero. Nell'esempio l'istruzione "return" è assenza
KAndy,

@KAndy sì, grazie. Ho modificato la mia domanda per dimostrarlo.
Kevin Chavez,

Risposte:


22

Ciò accade perché manca la "chiave segreta" quando si digita manualmente l'URL. Caratteristica chiave segreta è abilitata per default e può essere disabilitata qui: Stores => Configuration => Advanced => Admin => Security => Add Secret Key to URLs. Quindi dovresti essere in grado di raggiungere la tua azione.


@Alex Paliarush, come farlo funzionare quando le chiavi di sicurezza sono abilitate.?
Aswanth,

@Aswanth Basta aggiungere la tua azione al menu e fare clic su di essa. In questo caso Magento aggiungerà la chiave di sicurezza appropriata alla richiesta
Alex Paliarush

@AlexPaliarush Grazie Funziona per me .. e mi ha risparmiato tempo
REGOLA DI ZOE

Questo era il problema, ma perché il corso non dice questa condizione nell'esercizio? Ho perso qualche ora la selezione di questa ... Grrrrrrr
Binod - GoFundMonica

risposta perfetta !!! +1 :) ha reso la mia giornata
SagarPPanchal il

12

In router.xmlfile ( companyName/customModule/etc/adminhtml/router.xml) Per me la soluzione era avere l'id di route e frontName con lo stesso valore. Nel tuo caso questo sarebbe:

<?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>

Cambiato <route id="Bmanager" frontName="bmanager">per <route id="bmanager" frontName="bmanager">e ora posso fare un lavoro di base di controllo come descritto il corpo domanda. Ancora nessuna fortuna con i miei controller personalizzati. Modifica: in realtà uno dei miei controller personalizzati ha iniziato a dare alcuni errori. Molto meglio del reindirizzamento senza errori.
Adrian Moisa,

4

Forse è meglio usare quella proprietà:

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

2

Quando si tenta di accedere ai moduli / funzionalità nel back-end (Adminhtml), Magento verifica la presenza del segreto Form Keys e se / quando qualcuno tenta di accedere a un'azione e non fornisce un FormKey (ad esempio: hotlinking dell'URL) e / o fornisce un FormKey non valido: Adminhtml AbstractAction (Magento \ Backend \ App \ AbstractAction) indirizzerà la pagina di avvio definita dall'utente Admin UIX (che di solito è la pagina Dashboard)

[Questo meccanismo serve un "checkpoint di sicurezza" per impedire agli utenti di accedere a parti del Backend a cui non hanno accesso]


Quando accedi alle opzioni dal menu Admin UIX - Magento aggiungerà automaticamente FormKey per te.


Per impedire il controllo per FormKey hai due opzioni:

(a) Disattiva convalida FormKey

Navigazione: Negozi -> Impostazioni: Configurazione -> Avanzate: Amministratore -> Sicurezza -> Impostazione "Aggiungi chiave segreta agli URL" su "No"

È molto importante ricordare che ciò disattiverà la convalida della chiave segreta e quindi potrebbe rendere la tua applicazione vulnerabile.

Come disattivare la convalida di FormKey

(b) Disattiva la convalida FormKey per il tuo controller

Specificare le azioni che si desidera esentare, dal controllo FormKey, nell'attributo "$ _publicActions" del proprio controller di amministrazione.

protetto $ _publicActions = ['ENTER_NAME_OF_ACTION'];

Esempio di codice:

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

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

}

1

Il problema del reindirizzamento del routing con la chiave di sicurezza abilitata è l'URL dell'azione impostato nel menu.xml in / 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>

Il valore importante è il parametro di azione nella voce di menu. Prestare attenzione a impostare il nome del modulo dichiarato in route.xml nel parametro id. Nel mio 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>

0

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

ma potresti aggiungere un brickpoing a vendor / magento / module-backend / App / AbstractAction.php

if (!$_isValidFormKey || !$_isValidSecretKey) {}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.