Где в Backpack можно разместить вызов authorize ()?

Контроллеры Backpack не содержат методов Rest, как это типично для Laravel, но используют трейты для реализации операций CRUD и иногда (но не всегда - например, удаление не делает) методы установки (например, setupListOperation).

Для авторизации для остальной части моего приложения я использую объявления Gate в AppServiceProvider и объявляю $this->authorize() для проверки авторизации в каждом из моих контроллеров.

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


person xtraorange    schedule 19.07.2020    source источник


Ответы (2)


Обычно вы делаете это в своих классах FormRequest, см. https://backpackforlaravel.com/docs/4.1/crud-tutorial#the-request

Пример:

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;
use Illuminate\Foundation\Http\FormRequest;

class TagRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        // only allow updates if the user is logged in
        return backpack_auth()->check();
    }

}

Затем вы должны установить запрос в качестве валидатора для данной операции:

Пример

  protected function setupCreateOperation()
  {
      $this->crud->setValidation(TagRequest::class);

      // TODO: remove setFromDb() and manually define Fields
      $this->crud->setFromDb();
  }

ПРИМЕЧАНИЕ: Хотя это не ясно в документации или сгенерированных контроллерах (если вы используете генератор командной строки), вы можете фактически установить метод установки для ВСЕХ операций:

Если вы посмотрите на файлы пакетов allin.com/vendor/backpack/crud/src/app/Http/Controllers/CrudController.php, в методе setupConfigurationForCurrentOperation вы найдете:

/**
 * Load configurations for the current operation.
 *
 * Allow developers to insert default settings by creating a method
 * that looks like setupOperationNameOperation (aka setupXxxOperation).
 */
protected function setupConfigurationForCurrentOperation()
{
    $operationName = $this->crud->getCurrentOperation();
    $setupClassName = 'setup'.Str::studly($operationName).'Operation';
  
    //.....

    /*
     * THEN, run the corresponding setupXxxOperation if it exists.
     */
    if (method_exists($this, $setupClassName)) {
        $this->{$setupClassName}();
    }
}

Это означает, что если ваш контроллер определяет функцию setupDeleteOperation, она БУДЕТ вызываться во время настройки маршрута delete для вашего CRUD.

person Wesley Smith    schedule 20.07.2020

После использования ответа @Wesley Smith я обнаружил одноэтапный подход к этому.

Как упоминает Уэсли, вы можете создавать методы настройки для всех грубых операций, и это работает как отличное место для передачи аутентификации. Однако он не обновляет ссылки на другие операции. Например, список по-прежнему будет содержать ссылку для редактирования, даже если она неавторизована. Вы можете удалить их отдельными линиями, но есть более простой способ.

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

    public function setup()
    {
        CRUD::setModel(Workshop::class);
        CRUD::setRoute(config('backpack.base.route_prefix') . '/workshop');
        CRUD::setEntityNameStrings('workshop', 'workshops');

        if (Gate::denies('admin.workshop.list'))
            $this->crud->denyAccess('list');
        if (Gate::denies('admin.workshop.show'))
            $this->crud->denyAccess('show');
        if (Gate::denies('admin.workshop.create'))
            $this->crud->denyAccess('create');
        if (Gate::denies('admin.workshop.update'))
            $this->crud->denyAccess('update');
        if (Gate::denies('admin.workshop.delete'))
            $this->crud->denyAccess('delete');
    }

Это не только откажет в доступе к методам, но и обновит каждый метод соответствующими @can директивами лезвия, что означает, что неавторизованные методы не будут отображаться как ссылки.

person xtraorange    schedule 21.07.2020