Как использовать промежуточное ПО для пространственного разрешения в Laravel?

Я использую Laravel 8 и Spatie Role and Permission. Разрешение на каждое действие работает нормально. Но если я назначаю разрешение удалить действие субадминистратору, но нажимаю создать действие непосредственно из URL-адреса, промежуточное ПО не может остановить действие, поскольку пользователь не создал разрешения.

 public function __construct(CustomerInterface $customerInterface)
{
    $this->customerInterface = $customerInterface;
    $this->middleware(['permission:create_customer|delete_customer|edit_customer|chnage_customer_status']);
}

Я использую вышеуказанное промежуточное ПО в конструкторе. Как я могу решить эту проблему.


person Irshad Khan    schedule 02.04.2021    source источник


Ответы (1)


Насколько я могу судить из документации, когда вы используете permission промежуточное ПО с несколькими разрешениями, оно разрешит выполнение запроса, если хотя бы одно разрешение получено.

Вам нужна авторизация на основе методов, и для этого Laravel использует политики который по умолчанию позволяет писать отдельную авторизацию для общих методов. (индексировать, хранить, обновлять, показывать и т. д.)

Допустим, вы позволяете пользователю использовать store метод, только если у него есть разрешение create_customer, ваша политика будет выглядеть примерно так:

    /**
     * Determine whether the user can create models.
     *
     * @param User $user
     * @return mixed
     */
    public function create(User $user)
    {
        return $user->can('create_customer');
    }

Затем в свой контроллер вы помещаете функцию authorizeResource, которая связывает методы политики по умолчанию с методами контроллера ресурсов по умолчанию:

    public function __construct(CustomerInterface $customerInterface)
    {
        $this->customerInterface = $customerInterface;
        $this->authorizeResource(Customer::class); // assuming your model name is Customer
    }

в качестве альтернативы вы можете написать свои собственные методы политики и использовать их с помощью метода $this->authorize, который документирован далее здесь.

person WiGeeky    schedule 14.04.2021