Страницы

Поиск по вопросам

среда, 10 июля 2019 г.

Почему политики Laravel не работают с гостями?

Я использую политики laravel для проверки доступа к методам контроллера.
Вот мой контроллер PostController. Метод index() для вывода списка пользователей:
class PostController extends Controller { public function index(Post $post) { $this->authorize($post); return $post->all(); } }
Вот моя политика PostPolicy (проверка прав доступа к методу index() контроллера PostController).
class PostPolicy { // This function executes only for authenticated users. // I want to use it for guest users too public function index(User $user) { return $user->can('get-posts'); } }
Я использую модуль https://github.com/Zizaco/entrust для авторизации по ролям. Роли и привилегии хранятся в базе и я могу использовать вызов $user->can('get-posts') для проверки прав на просмотр списка постов. Это работает с аутентифицированными пользователями, но почему-то не работает с гостями. Для гостей вообще не вызывается метод Index в политике PostPolicy. Для гостей доступ к методу index контроллера PostController всегда запрещен.
Почему в Laravel политики не работают с гостями? Ведь у гостей тоже могут быть какие-то права. Как мне назначать права гостям?


Ответ

Проблема в том, что index ожидает на вход объект класса User:
public function index(User $user)
А если пользователь не авторизован, то он для него не существует такого объекта. Мне больше всего понравилось такое решение: Создается класс Guest extends User и пишете
# Http/Middleware/Authenticate protected function authenticate(array $guards) { if (empty($guards)) { return $this->auth->authenticate(); }
foreach ($guards as $guard) { if ($this->auth->guard($guard)->check()) { return $this->auth->shouldUse($guard); } }
$this->auth->setUser(new Guest()); }
https://github.com/laravel/framework/issues/10568#issuecomment-243692377
Соответственно в аргумент пишете
public function index(Guest $user)

Комментариев нет:

Отправить комментарий