Laravel 授权系统 - 自定义参数

基础

本文基于 laravel 5.5
在阅读本文前,请先浏览一下 laravel 5.5 用户授权

生成

php artisan make:policy PostPolicy --model=Post

我们用上面的命令生成的策略文件会含有四个方法(已去除所有注释):

<?php
namespace App\Policies;
use App\User;
use App\Models\Project;
use Illuminate\Auth\Access\HandlesAuthorization;

class ProjectPolicy
{
    public function view(User $user, Project $project)
    {
        //
    }

    public function create(User $user)
    {
        //
    }

    public function update(User $user, Project $project)
    {
        //
    }

    public function delete(User $user, Project $project)
    {
        //
    }
}

这四个方法对应的是 资源控制器的 CRUD 方案,也就是增、删、查、改。
我们一般会在控制器中使用:

public function update(ProjectRequest $projectRequest, Project $project)
{
    $this->authorize('update', $project);
    ...
}

当然,在策略方法名和控制器方法名一致时,有更加优美的写法(请参照 laravel 5.2 用户授权 - 自动判断授权策略方法 ):

public function update(ProjectRequest $projectRequest, Project $project)
{
    $this->authorize($project);
    ...
}

注:策略中的 view 对应的是 show 方法

自定义

很多时候,我们还得自己定义策略方法,一般情况与自动生成的方法无异,比如:

...
// Project move
public function move(User $user, Project $project)
{
    //
}
...

但,如果方法的参数与策略对应的 Model 不一致,按照原有的方法使用会一直授权失败,403
例:
一个部门(Department)有很多成员(User),项目(Project)属于部门,只有部门的成员可以创建项目
我们重写一下 create 方法,两个参数, User - 当前用户,Department - 项目属于的部门

...
public function create(User $user, Department $department)
{
    //判断用户是否属于该部门
    return $department->users()->whereId($user->id)->exists();
}
...

我们要按照一下使用方法才能成功调用策略:

public function create(Department $department)
{
     $this->authorize('create', [Project::class, $department]);
     // $this->authorize([Project::class, $department]);
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!