Методы авторизации работают только для default guard в Laravel

Методы авторизации работают только для default guard в Laravel

23.12.2019 10:03:30 Просмотров 48 Источник

Я использую Laravel 5.5 и пытаюсь использовать Gatefacade, чтобы позволить администраторам получать доступ к ресурсам, таким как пользователи. Во-первых, я определяю ворота в AuthServiceProvider.phpнравится следующее:

Gate::define('view-users', 'App\Policies\UserPolicy@view');

Затем, я пишу view метод политического класса, как это:

public function view(Admin $admin, User $user)
{
    return true;
}

И, я применяю разрешение следующим образом:

//UsersController.php

$user = User::first();
if (Gate::allows('view-users', $user)) {
    $users = User::all();
    return view('admin.users.list', compact('users'));
}
return abort(403);

Я отмечаю, что аргумент $userявляется бесполезной переменной, и мне не нужно, чтобы он выполнял авторизацию. Кстати, когда я использую allows()Gateвместо этого, эти шаги работают нормально.

что случилось с denies() метод?!

Однако, в соответствии с документами Laravel, я протестировал другие способы применения авторизации через allows(), middleware()или Model. Но я получил тот же результат.

Редактировать: Я должен отметить, что использую пользовательский guard с именем authorize()

Спасибо за любую помощь.

У вопроса есть решение - Посмотреть?

Ответы - Методы авторизации работают только для default guard в Laravel / Authorization methods only works for default guard in Laravel

Является ответом!
Hafez Divandari

23.12.2019 10:46:30

Измените свой метод политики на этот:

public function view(User $user)
{
    return $user->isAdmin;
}

Первым аргументом метода политики всегда является текущий аутентифицированный пользователь. Обратите внимание, что вы не обязаны передавать текущему аутентифицированному пользователю эти методы. Laravel автоматически позаботится о прохождении пользователя в ворота закрытия:

if (Gate::allows('view-users')) {
    // The current user can view all users...
}

Если вы хотите проверить, может ли текущий пользователь обновить определенного пользователя, ваш метод политики будет следующим:

public function update(User $authenticatedUser, User $beeingEditedUser)
{
    return $authenticatedUser->isAdmin;
}

Тогда авторизуйтесь вот так:

if (Gate::allows('update-user', $beeingEditedUser)) {
    // The current user can update the user...
}

Если вы используете custom guard (в соответствии с вашим комментарием ), У вас может быть 2 варианта:

  1. Используйте forUser
    1. Охрана маршрутов, указание охранника:
    use Illuminate\Support\Facades\Auth;
    
    if (Gate::forUser(Auth::guard('web_admin')->user())->allows('view-users')) {
        // The current user can view all users...
    }
    

    Это вызывает Larvel, чтобы установить по умолчанию драйвер авторизации и разрешения пользователя проверки подлинности на основе пользовательских гвардии.

https://stackoverflow.com/questions/59460156/authorization-methods-only-works-for-default-guard-in-laravel/59460588#comment105106151_59460588
Спасибо за вашу помощь. Я применил ваше решение,но проблема остается. Я изменил view метод public function view(Admin $admin){return $admin->isSuperAdmin();}, так что isSuperAdmin() возвращает $this->admin_name === 'particular_name' ?: false;. Я должен отметить, что администраторы извлекаются на разных сторожах с именем web_adminкоторые я объявляю в auth.php основе Laravel. Я буду признателен за ваше следующее решение.
https://stackoverflow.com/questions/59460156/authorization-methods-only-works-for-default-guard-in-laravel/59460588#comment105119978_59460588
Спасибо за ваше редактирование, ваше решение работает сейчас.
Закрыть X