Laravel 5.4策略检查始终为假

时间:2018-07-25 08:18:38

标签: laravel policy

因此,我创建了一个策略并将其注册在AuthServicePRovider中,但是它始终返回false。这是我第一次使用政策,因此我确定我做错了,但是下面的几个例子对我没有任何帮助。

AuthServiceProvider

protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
        Article::class => ArticlePolicy::class,
    ];

ArticleController @ show

public function show($article_id) I 
{
    $article = DB::table('pjt_article as a')
        ->join('pjt_categories_article as c', 'a.cate_id', '=', 'c.cate_id')
        ->where('article_id', $article_id)
        ->first();
    $this->authorize('view', $article->username);
    return view('admin.content.show-article', ['art' => $article]);
}

ArticlePolicy

public function view(Admin $admin, Article $article)
{
    return $admin->id == $article->username;
}

我正在尝试==和===,但无法正常工作

此图片错误403

enter image description here

1 个答案:

答案 0 :(得分:2)

您的策略已映射到Model类名。您必须具有一个模型实例才能执行此操作。您的查询直接使用查询生成器,而不返回模型实例。

$article = Article::....->first();

对于authorize,您想将您要授权的资源传递给authorize,而不是最终要在策略中签入资源的属性:

$this->authorize('view', $article->username);

// to

$this->authorize('view', $article);

Gate知道甚至对资源使用策略的方式是因为所传递的对象的类型,或者是否传递了类名。