授权方法仅适用于Laravel中的默认防护

时间:2019-12-23 19:03:30

标签: php laravel

我正在使用Laravel 5.5,并且尝试使用Gate门面来允许管理员访问用户等资源。首先,我在AuthServiceProvider.php中定义一个门,如下所示:

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

然后,我像这样在Policy类中编写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方法时,它总是返回false。而当我改用denies()时,这些步骤可以正常工作。

allows()方法有什么问题?!

但是,与Laravel文档相对应,我测试了通过middleware()Modelauthorize()来应用授权的其他方法。但是,我得到了相同的结果。

编辑: 我应该注意,我正在使用名为web_admin

的自定义防护

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

将您的政策方法更改为此:

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...
}

如果您使用自定义防护(根据your comment),则可能有2个选项:

  1. 使用forUser方法:
use Illuminate\Support\Facades\Auth;

if (Gate::forUser(Auth::guard('web_admin')->user())->allows('view-users')) {
    // The current user can view all users...
}
  1. 保护路线,指定警卫:
Route::middleware('auth:web_admin')->group(function () {
    Route::get('/users', 'UserController@index');
});

这会使Larvel设置您的默认身份验证驱动程序,并根据您的自定义防护来解析身份验证用户。