【发布时间】:2017-12-31 20:07:04
【问题描述】:
我在 Laravel 5.4 项目中实现了多个 Auth 保护(一个用于管理员,另一个用于普通用户)。到目前为止,这已经成功,管理员和用户都可以登录。我现在正在尝试实现一个适用于两个 Auth 保护的 Policy 类。这是因为我希望所有管理员都可以编辑某些模型,并且只有拥有该模型的用户才能编辑。所以我用这种方法定义了一个策略。
App\Policies\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;
}
然后在我为我的模型使用的任何控制器方法中:
App\Http\Controllers\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 类?
【问题讨论】:
-
太神奇了,我也有同样的情况:)