Я настроил мою модель политики, и она, кажется, работает, когда я авторизую действия из действий контроллера.
// create action
public function create()
{
$this->authorize('create', BusinessProfile::class);
return view('business-profile.create');
}
Политика для создания просто возвращает true или false, и переключение логического значения, кажется, работает, поскольку я авторизован на основе этого.
Это соответствует тому, что мои политики настроены правильно.
Однако вместо использования authorize
Метод везде в моем контроллере, я попытался установить промежуточное ПО в моем конструкторе.
Документация Laravel показывает этот пример.
Route::post('/post', function () {
// The current user may create posts...
})->middleware('can:create,App\Post');
Итак, я написал это в моем конструкторе контроллера.
public function __construct()
{
$this->middleware('auth');
$this->middleware('can:create,BusinessProfile')->only('create');
}
Однако при этом действие всегда является несанкционированным.
Бонусная информация
Я пошел дальше и написал мусорный код в своей политике, чтобы вызвать синтаксическую ошибку, и все же я получаю неавторизованный ответ, который говорит мне, что моя политика вообще не запускается. Возможно, я не правильно зарегистрировал свою политику, но, как упоминалось выше, $this->authorize(...)
работает как положено.
Кажется, вы использовали псевдоним для своей модели, в то время как для нее требуется название модели. В документации говорится:
некоторые действия, такие как создание, могут не требовать экземпляра модели. В этих
В некоторых ситуациях вы можете передать имя класса промежуточному программному обеспечению. Класс
имя будет использоваться для определения того, какую политику использовать при авторизации
Действие:
Вы можете найти больше информации здесь: https://laravel.com/docs/5.4/authorization#policy-methods
Итак, в конструкторе контроллера эта строка:
$this->middleware('can:create,BusinessProfile')->only('create');
станет:
$this->middleware('can:create,App\BusinessProfile')->only('create');
Других решений пока нет …