如何在Laravel授权中将数字传递给中间件“can”

时间:2017-10-05 07:30:06

标签: php laravel laravel-5.4

基于文档https://laravel.com/docs/5.5/authorization#via-middleware

use App\Post;

Route::put('/post/{post}', function (Post $post) {
    // The current user may update the post...
})->middleware('can:update,post');

'can:update,post'中的'post'是从'{post}'传递的变量。

我尝试使用中间件('可以:更新,1')。它不起作用。也许它搜索'$ 1'变量,如何将数字'1'传递给'can'中间件?

更新这是门:

    Gate::define('update', function ($user, $role){
        $id = $user->id;
        $roles = $user::find($id)->roles()->get();
        $roleid = $roles[0]->pivot->role_id;
        //above code just for get role id, and $role_id is 1
       return $roleid === $role;
    });

2 个答案:

答案 0 :(得分:1)

可能您没有为Post创建策略。

您可以通过命令创建:

php artisan make:policy PostPolicy --model=Post

然后在该策略中实现方法更新。

答案 1 :(得分:1)

我遇到了同样的问题,所以我做了一些“ can”中间件的研究(哪个映射到Illuminate\Auth\Middleware\Authorize

在课堂上,我们将看到以下代码

 /**
     * Get the model to authorize.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  string  $model
     * @return \Illuminate\Database\Eloquent\Model|string
     */
    protected function getModel($request, $model)
    {
        if ($this->isClassName($model)) {
            return trim($model);
        } else {
            return $request->route($model, null) ?:
                ((preg_match("/^['\"](.*)['\"]$/", trim($model), $matches)) ? $matches[1] : null);
        }
    }

这意味着...

  • 如果传入的字符串是一个类名,则返回该类名
  • 如果不是类名,则...
    • 1尝试从路线中获取它,然后返回路线参数
    • 2尝试通过正则表达式"/^['\"](.*)['\"]$/"从字符串中获取模型

现在让我们说我们有一个中间件调用 $this->middleware(sprintf("can:create,%s,%s", User::class, Role::SUPPORT));
由于Role::SUPPORT与正则表达式不匹配,因此无法使用
要匹配它,我们只需要将Role::SUPPORT放在引号中即可。
注意第二个%s附近的“'” $this->middleware(sprintf("can:create,%s,'%s'", User::class, Role::SUPPORT));

要具体回答您的问题,请引用您的“ 1”值

middleware("can:update,'1'").