我正在使用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()
,Model
或authorize()
来应用授权的其他方法。但是,我得到了相同的结果。
编辑:
我应该注意,我正在使用名为web_admin
感谢您的帮助。
答案 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个选项:
forUser
方法:use Illuminate\Support\Facades\Auth;
if (Gate::forUser(Auth::guard('web_admin')->user())->allows('view-users')) {
// The current user can view all users...
}
Route::middleware('auth:web_admin')->group(function () {
Route::get('/users', 'UserController@index');
});
这会使Larvel设置您的默认身份验证驱动程序,并根据您的自定义防护来解析身份验证用户。