laravel - 对一个策略使用多个 Auth 保护

标签 laravel laravel-5

我在 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;
}

然后在我为我的模型使用的任何 Controller 方法中:

App\Http\Controllers\ModelController
public function update(Model $model)
{
    $this->authorize('update', $model);

    // update model
}

如果普通用户登录,这非常有效。但是,当管理员用户登录时,它甚至没有达到策略(我从错误日志中知道这一点)。我猜如果 Auth::check() 中的默认保护,Policy 类会自动拒绝请求。失败。但是,由于我的用户拥有多个守卫之一(不仅仅是默认设置)是有效的,因此我需要绕过此行为。

我知道我可以在我的 Controller 方法中实现管理逻辑,并且只有在我知道我正在与非管理员打交道时才使用该策略:
public function update(Model $model)
{
    if (!Auth::guard('admin')->check()) {
        $this->authorize('update', $model);
    }

    // update model
}

但是,如果我的管理条件比简单登录更复杂,这可能会迅速失控。更重要的是,所有这些逻辑都属于策略,而不是混淆我的 Controller 。

如何为多个身份验证守卫使用相同的策略类?

最佳答案

我最终覆盖了 authorize基 Controller 类上的方法,使正确的 Guard 成为默认的 Guard。然后,$user传递到我的策略中的参数将是当前用户登录的任何 Auth 守卫的实例。

app/Http/Controllers/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);
    }
}

既然 Policy 将在我的 User 模型或我的 Admin 模型中传递,我需要确保删除参数的类型提示并检查传入的模型的类型。我不需要做任何事 Auth::check()因为我知道 $user传入的必须是我想要的类型的登录用户。

App\Policies\ModelPolicy
use App\User;

public function update($user, Model $model)
{
    if ($user instanceof User) {
        return $user->id == $userId;
    }

    // Is an Admin
    return true;
}

现在我可以访问所需的 Auth 守卫,以便在我的政策中使用它做任何我想做的事情。

关于laravel - 对一个策略使用多个 Auth 保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45311062/

相关文章:

jquery - 动态依赖下拉框在 laravel 中使用 ajax 不起作用

Laravel 5.2 - bootstrap/cache/services.php 丢失

laravel-5 - 错误 响应内容必须是实现 __toString() 的字符串或对象,在服务提供者中绑定(bind)时给出 "object"

php - 在 Laravel 5 中将变量从路由传递到 Controller

php - Laravel 调度作业不异步运行,阻碍执行

laravel - laravel 方法 vs trait vs facade 有什么区别

laravel - 如何解决Facade\Ignition\Http\Middleware\IgnitionEnabled?

mysql - 使用 Laravel 和 MySQL 比较时间

php - 从不同的关系中获取最新的 eloquent laravel

php - 使用 Laravel 或 PHP 在 mysql 表上建立条件关系