Политика Laravel для редактирования

Итак, я создал политику и зарегистрировал ее в AuthServicePRovider, но она всегда возвращает false. Я впервые работаю с политиками, поэтому я уверен, что делаю это неправильно, но, следуя нескольким примерам, у меня ничего не получилось.

Я вошел в систему с пользователем с идентификатором 1. Я пытаюсь отредактировать метку с идентификатором пользователя, равным 1, возвращает false, а также при попытке отредактировать метку с идентификатором пользователя, равным 2. Этот последний работает, как и ожидалось. , но если совпадают user_id и label-> user_id, я должен отобразить форму. Вместо этого я получаю это каждый раз:

This action is unauthorized.

Есть идеи?

AuthServiceProvider: (пробовал оба, но оба не работают):

protected $policies = [
'App\Label' => 'App\Policies\LabelPolicy'
];

And this one also did not do the trick:

protected $policies = [
Label::class => LabelPolicy::class
];

LabelsController @ редактировать:

public function edit(Label $label)
{
// $this->authorize('edit', $label); // This also returns false

if (auth()->user()->cannot('edit', $label)) {
dd('NO'); // This is always shown
}
}

LabelPolicy:

public function edit(Label $label)
{
dd('test'); // This is never shown anywhere
return auth()->user()->id === $label->user_id;
}

0

Решение

Политики ожидают фактически двух входов, первый вход всегда является классом User, второй ввод является моделью и по умолчанию равен классу модели. Итак, в вашем случае:

LabelPolicy

public function edit(User $user, Label $label)
{
return $user->id === $label->user_id;
}

LabelsController @ редактировать:

public function edit(Label $label)
{
$this->authorize($label);
}
1

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

если ваш $ this-> authorize внутри Controllers всегда возвращает false, то дважды проверьте, было ли ваше пространство имен модели и политики модели импортировано в AuthServiceProvider, а также ваша модель была импортирована в ваш контроллер.

1

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