我在Laravel 5.4项目中实现了多个Auth警卫(一个用于管理员,另一个用于普通用户)。到目前为止,这已经成功运行,管理员和用户都可以登录。我现在正在尝试实现一个适用于两个Auth警卫的Policy类。这是因为我有一些模型,我希望所有管理员都可以编辑,只有拥有该模型的用户才能进行编辑。所以我用这种方法定义了一个策略。
应用\策略\ ModelPolicy
public function update(User $user, Model $model)
{
if ($user->id === $model->user_id) {
return true;
}
if (Auth::guard('admin')->check()) {
return true;
}
return false;
}
然后用我的模型控制器方法:
应用\ HTTP \控制器\ ModelController
public function update(Model $model)
{
$this->authorize('update', $model);
// update model
}
如果常规用户已登录,则此功能非常有效。但是,当管理员用户登录时,它甚至无法访问策略(我从错误日志记录中知道这一点)。我猜如果Auth::check()
中的默认保护失败,Policy类会自动拒绝请求。但是,由于我的用户有几个警卫(不仅仅是默认值)之一,我需要绕过这种行为。
我知道我可以在我的控制器方法中实现管理逻辑,只有在我知道我正在处理非管理员时才使用该策略:
public function update(Model $model)
{
if (!Auth::guard('admin')->check()) {
$this->authorize('update', $model);
}
// update model
}
然而,如果我的管理条件比单纯登录更复杂,这可能会迅速失控。更重要的是,所有这些逻辑都属于策略,而不是混淆我的控制器。
如何为多个身份验证保护使用相同的Policy类?
答案 0 :(得分:0)
您可以覆盖公共控制器中的“authorize”方法(/app/Http/Controllers/Controller.php
):
class Controller extends BaseController
{
use AuthorizesResources, DispatchesJobs, ValidatesRequests;
use AuthorizesRequests {
authorize as protected laravelAuthorize;
}
public function authorize($ability, $arguments = [])
{
if (!Auth::guard('admin')->check()) {
$this->laravelAuthorize($ability, $arguments);
}
}
}
答案 1 :(得分:-1)
我最终覆盖了基本控制器类上的authorize
方法,以使正确的Guard成为默认的Guard。然后,传递到我的策略中的$user
参数将是当前用户登录的任何Auth警卫的实例。
应用/ HTTP /控制器/ Controller.php这样强>
use Auth
class Controller extends BaseController
{
use DispatchesJobs, ValidatesRequests;
use AuthorizesRequests {
authorize as protected baseAuthorize;
}
public function authorize($ability, $arguments = [])
{
if (Auth::guard('admin')->check()) {
Auth::shouldUse('admin');
}
$this->baseAuthorize($ability, $arguments);
}
}
现在该策略将在 我的用户模型或我的Admin模型中传递,我需要确保删除参数的类型提示并检查模型的类型传入。我不需要执行任何Auth::check()
,因为我知道传入的$user
必须是我想要的类型的登录用户。
应用\策略\ ModelPolicy 强>
use App\User;
public function update($user, Model $model)
{
if ($user instanceof User) {
return $user->id == $userId;
}
// Is an Admin
return true;
}
现在我可以访问所需的Auth警卫,在我的政策中随心所欲地做任何事情。