Magento 2 Hành động quản trị viên tùy chỉnh được chuyển hướng đến Bảng điều khiển


18

Tôi đang tham gia khóa học phát triển cơ bản Magento 2 và bài tập Bộ định tuyến / Bộ điều khiển dành cho Quản trị viên dường như đã lỗi thời. Bộ định tuyến không hoạt động, nhưng bộ điều khiển thì không, nó luôn chỉ định tuyến lại đến trang chủ của quản trị viên. Mã cho ứng dụng bộ định tuyến / mã / Đào tạo / Kiểm tra / 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>

Mã cho ứng dụng / mã điều khiển dành cho quản trị viên / Đào tạo / Kiểm tra / Trình điều khiển / 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;
    }
}

Khi tôi truy cập url quản trị của admin / test / action / index, nó chỉ chuyển hướng và không có gì xảy ra. Nếu tôi thêm một hàm tạo và sử dụng xdebug, nó cho thấy rằng nó đến được hàm tạo của trình điều khiển, nhưng nó không bao giờ thực hiện phần thực thi. Tôi đang thiếu gì?


Tôi hy vọng trong chức năng mã của bạn _is ALLowed trả về đúng. Trong ví dụ hướng dẫn "trở lại" là vắng mặt
KAndy

@KAndy đúng vậy, cảm ơn. Chỉnh sửa câu hỏi của tôi để cho thấy rằng.
Kevin Chavez

Câu trả lời:


22

Điều này xảy ra vì 'khóa bí mật' bị thiếu khi bạn chỉ cần nhập URL thủ công. Tính năng khóa bí mật được bật theo mặc định và có thể được tắt ở đây : Stores => Configuration => Advanced => Admin => Security => Add Secret Key to URLs. Sau đó, bạn sẽ có thể đạt được hành động của bạn.


@Alex Paliarush, làm thế nào để nó hoạt động khi khóa bảo mật được bật.?
Aswanth

@Aswanth Chỉ cần thêm hành động của bạn vào menu, và nhấp vào nó. Trong trường hợp này, Magento sẽ thêm khóa bảo mật thích hợp vào yêu cầu
Alex Paliarush

@AlexPaliarush Cảm ơn Nó hoạt động với tôi .. và tiết kiệm thời gian của tôi
ZOE RULE

Đây là vấn đề nhưng tại sao khóa học không nói về tình trạng này trong bài tập? Tôi bị mất một số giờ kiểm tra này ... Grrrrrrr
Binod - GoFundMonica

câu trả lời hoàn hảo!!! +1 :) làm cho ngày của tôi
SagarPPanchal

12

Trong router.xmltệp ( companyName/customModule/etc/adminhtml/router.xml) Đối với tôi, giải pháp là có id tuyến và frontName có cùng giá trị. Trong trường hợp của bạn, điều này sẽ là:

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

Thay đổi <route id="Bmanager" frontName="bmanager">thành <route id="bmanager" frontName="bmanager">và bây giờ tôi có thể làm cho bộ điều khiển cơ bản hoạt động như mô tả thân câu hỏi. Vẫn không có may mắn với bộ điều khiển tùy chỉnh của tôi. Chỉnh sửa: Trên thực tế, một trong những bộ điều khiển tùy chỉnh của tôi bắt đầu đưa ra một số lỗi. Tốt hơn nhiều so với chuyển hướng không có erorrs.
Adrian Moisa

4

Có lẽ tốt hơn là sử dụng tài sản đó:

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

2

Khi cố gắng truy cập các mô-đun / chức năng trong phần phụ trợ (adminhtml), Magento sẽ kiểm tra sự hiện diện của bí mật Form Keysvà nếu / khi ai đó cố gắng truy cập một hành động và không cung cấp FormKey (ví dụ: hotlinking url) và / hoặc cung cấp một FormKey không hợp lệ - Tóm tắt Actinhtml (Magento \ Backend \ App \ AbstractAction) sẽ định tuyến trang Khởi động được xác định của Quản trị viên UIX (thường là trang Bảng điều khiển)

[Cơ chế này phục vụ "điểm kiểm tra bảo mật" để ngăn người dùng truy cập vào các phần của Phần cuối mà họ không có quyền truy cập]


Khi truy cập các tùy chọn từ Menu Admin UIX - Magento sẽ tự động thêm FormKey cho bạn.


Để ngăn việc kiểm tra FormKey, bạn có hai tùy chọn:

(a) Tắt Xác thực FormKey

Điều hướng: Cửa hàng -> Cài đặt: Cấu hình -> Nâng cao: Quản trị viên -> Bảo mật -> Cài đặt "Thêm khóa bí mật vào URL" thành "Không"

Điều rất quan trọng cần nhớ là làm như vậy sẽ tắt Xác thực khóa bí mật và do đó có thể khiến ứng dụng của bạn dễ bị tấn công.

Cách tắt Xác thực FormKey

(b) Tắt Xác thực FormKey cho bộ điều khiển của bạn

Chỉ định (các) hành động bạn muốn miễn trừ, từ kiểm tra FormKey, trong thuộc tính "$ _publicActions" của Trình điều khiển quản trị của bạn.

được bảo vệ $ _publicActions = ['ENTER_NAME_OF_ACTION'];

Mã ví dụ:

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

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

}

1

Vấn đề của chuyển hướng định tuyến với khóa bảo mật được bật là url hành động được đặt trong menu.xml trong / 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>

Giá trị quan trọng là tham số hành động trong mục menu. Hãy chú ý đặt tên của mô-đun được khai báo vào tệp Rout.xml thành tham số id. Trong trường hợp của tôi: "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()) ?>" /> sẽ giúp

nhưng bạn có thể thêm một lát gạch vào nhà cung cấp / magento / mô-đun phụ trợ / Ứng dụng / Tóm tắtAction.php

if (!$_isValidFormKey || !$_isValidSecretKey) {}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.