Magento2'deki çekirdek Eklentiler nasıl geçersiz kılınır veya devre dışı bırakılır?


16

Magento2 kullanarak bir pazar yapıyorum. Bu nedenle, satıcının müşteri kimlik bilgilerini kullanarak müşterinin siparişini yükleyebilmem gerekir.

Buradaki sorun Magento2'nin yalnızca bu siparişin (veya bir Yönetici) Müşterinin siparişi yükleyebildiğini doğrulamak için bir Eklenti kullanmasıdır.

Bu durumda, eklentiyi bir bütün olarak geçersiz kılmam veya korumalı yöntemi geçersiz kılmam gerekir isAllowed(). Çekirdeği değiştirmeden ne yapabilirim?

Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization Buna benzer:

use Magento\Authorization\Model\UserContextInterface;
use Magento\Framework\Exception\NoSuchEntityException;
class Authorization
{
    /**
     * @var UserContextInterface
     */
    protected $userContext;

    /**
     * @param UserContextInterface $userContext
     */
    public function __construct(
        \Magento\Authorization\Model\UserContextInterface $userContext
    ) {
        $this->userContext = $userContext;
    }

    /**
     * Checks if order is allowed
     *
     * @param \Magento\Sales\Model\ResourceModel\Order $subject
     * @param callable $proceed
     * @param \Magento\Framework\Model\AbstractModel $order
     * @param mixed $value
     * @param null|string $field
     * @return \Magento\Sales\Model\Order
     * @throws NoSuchEntityException
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function aroundLoad(
        \Magento\Sales\Model\ResourceModel\Order $subject,
        \Closure $proceed,
        \Magento\Framework\Model\AbstractModel $order,
        $value,
        $field = null
    ) {
        $result = $proceed($order, $value, $field);
        if (!$this->isAllowed($order)) {
            throw NoSuchEntityException::singleField('orderId', $order->getId());
        }
        return $result;
    }

    /**
     * Checks if order is allowed for current customer
     *
     * @param \Magento\Sales\Model\Order $order
     * @return bool
     */
    protected function isAllowed(\Magento\Sales\Model\Order $order)
    {
        return $this->userContext->getUserType() == UserContextInterface::USER_TYPE_CUSTOMER
            ? $order->getCustomerId() == $this->userContext->getUserId()
            : true;
    }
}

Yanıtlar:


23

1) Eklentiyi ada göre devre dışı bırakabilirsiniz. Senin durumunda authorization.

<type name="Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization">
    <plugin name="authorization" disabled="true" />
</type>
<type name="Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization">
    <plugin name="vendor_name_authorization" type="Vendor\Name\Model\ResourceModel\Plugin\Sales\Order\Authorization" sortOrder="1" />
</type>

Sonra magento plugin sınıfını genişletecek kendi sınıfını oluşturmalısınız. Kendi sınıfınızda korumalı yöntemin üzerine yazabilirsiniz.

2) Eklentiyi silmeden ve yeniden oluşturmadan yapabilirsiniz:

<type name="Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization">
    <plugin name="authorization" type="Vendor\Name\Model\ResourceModel\Plugin\Sales\Order\Authorization" sortOrder="1" />
</type>

Eklenti sınıfınızın örnek kodu:

namespace Vendor\Name\Model\ResourceModel\Plugin\Sales\Order;
class Authorization extends \Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization
{
    protected function isAllowed(\Magento\Sales\Model\Order $order)
    {
            ///You code here
    }
}

webapi_rest klasörünün içindeki eklentiyi geçersiz kılarak denedim ama çalışmıyor
bhargav shastri

6

Eğer kullanırsanız sergei.sss 1 çözümünü, sen hatasını alırsınız yinelenen Magento \ Satış \ Modeli \ ResourceModel \ al \ Eklentisi \ Yetkilendirme
yapılacak doğru yoludur:

<type name="Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization">
    <plugin name="authorization" disabled="true" />
    <plugin name="vendor_name_authorization" type="Vendor\Name\Model\ResourceModel\Plugin\Sales\Order\Authorization" sortOrder="1" />
</type>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.