Методы авторизации работают только для default guard в Laravel
Я использую Laravel 5.5 и пытаюсь использовать Gate
facade, чтобы позволить администраторам получать доступ к ресурсам, таким как пользователи. Во-первых, я определяю ворота в 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

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 варианта:
- Используйте
forUser
- Охрана маршрутов, указание охранника:
use Illuminate\Support\Facades\Auth; if (Gate::forUser(Auth::guard('web_admin')->user())->allows('view-users')) { // The current user can view all users... }
Это вызывает Larvel, чтобы установить по умолчанию драйвер авторизации и разрешения пользователя проверки подлинности на основе пользовательских гвардии.

view
метод public function view(Admin $admin){return $admin->isSuperAdmin();}
, так что isSuperAdmin()
возвращает $this->admin_name === 'particular_name' ?: false;
. Я должен отметить, что администраторы извлекаются на разных сторожах с именем web_admin
которые я объявляю в auth.php
основе Laravel. Я буду признателен за ваше следующее решение.
