Laravel — авторизация работает только из метода контроллера

Я настроил мою модель политики, и она, кажется, работает, когда я авторизую действия из действий контроллера.

// 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(...) работает как положено.

0

Решение

Кажется, вы использовали псевдоним для своей модели, в то время как для нее требуется название модели. В документации говорится:

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

Вы можете найти больше информации здесь: https://laravel.com/docs/5.4/authorization#policy-methods

Итак, в конструкторе контроллера эта строка:

$this->middleware('can:create,BusinessProfile')->only('creat‌​e');

станет:

$this->middleware('can:create,App\BusinessProfile')->only('c‌​reate');
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]