Я использую политики 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)
Комментариев нет:
Отправить комментарий