首页 > 解决方案 > 将策略与 apiResource 路由一起使用

问题描述

目前我正在编写一个 Laravel 5.6 REST api。现在我想保护我的端点:

我的应用程序中的每个用户都有一个角色。基于此,用户应该能够访问某些端点,否则应该会收到 403 错误。为此,我想使用它Policies,因为当用作中间件时,它们可以在传入请求甚至到达我的路由或控制器之前授权操作。

我这样声明我的端点:

Route::apiResource('me', 'UserController');

我现在的问题是,如果我想Policies用作中间件,我必须像这样指定(HTTP)方法middleware('can:update,post')apiResource当我在我的路由声明中使用时,我应该怎么做?

顺便说一句:目前我已经FormRequest为每种方法编写了一个(这很痛苦)并在那里进行授权。我可以在切换到中间件后简单return true的方法吗?authorizePolicies

标签: laravel

解决方案


由于您FormRequest::class用于验证请求数据,因此最好先检查用户是否有权发出请求。对于 Laravel 5.6,最简洁的解决方案是在__construct()资源控制器的方法中手动指定每个策略。

public function __construct()
{
    $this->middleware('can:viewAny,App\Post')->only('index');
    $this->middleware('can:create,App\Post')->only('store');
    $this->middleware('can:view,post')->only('show');
    $this->middleware('can:update,post')->only('update');
    $this->middleware('can:delete,post')->only('delete');
}

如果您在控制器内验证表单数据而不是使用FormRequest::class,则更简洁的解决方案是还授权控制器内的用户。

public function store(Request $request)
{
    $this->authorize('create', Post::class);
    // The user is authorized to make this request...

    $request->validate([
        //Validation Rules
    });
    // The form data has been successfully validated...

    // Controller logic...
}

__construct()从 Laravel 5.7 开始,您可以使用控制器方法上的一行代码来完成所有这些工作。

public function __construct()
{
    $this->authorizeResource(Post::class, 'post');
}

推荐阅读