没有调用Laravel Gate方法

时间:2017-05-22 22:02:02

标签: laravel authorization

在我的Laravel 5.4应用程序中,用户可以在这些项目中创建项目,然后创建帖子。

我试图阻止用户在他们无法访问的项目中创建或编辑帖子。 为此,我按照此处的说明实现了一个门:https://laravel.com/docs/5.4/authorization#gates 门检查用户是否是项目的所有者。

Gate::define('create-post', function ($user, $project) {
    Log::info($project) // !!! Never gets called
    return $project->owner_id == $user->id;
});

在PostController上,我调用Gate :: denies将项目作为参数传递

if (Gate::denies('create-post', $project)) {
    abort(403);
}

问题是我为门定义的代码永远不会被调用。相反,它总是返回false并转到403错误。 但是,如果我没有将项目作为参数传递,那么代码就会被调用,但这会使它变得毫无用处。

我还想补充一点,在这种情况下我不能使用策略,因为create方法只接受一个参数($ user),如果我尝试传递$ project,它的失败方式与Gate相同。< / p>

这是一个错误吗?是否有另一种更好的方法来实现这种功能?感谢。

4 个答案:

答案 0 :(得分:1)

我有同样的问题。当Gate :: allows()中的第二个参数是一个雄辩的模型时,似乎出现了错误。

如果你传入denies()任何其他变量(甚至是对象,但不是雄辩的模型),你的Log :: info()将会起作用。 我浪费了一整天,并切换到$ user-&gt; can()

答案 1 :(得分:0)

我能够通过使用策略来修复它。我在ProjectPolicy中创建了以下方法:

public function createOrEditPosts(User $user, Project $project)
{
    return $project->owner_id == $user->id;
}

然后从PostController我打电话:

$this->authorize('createOrEditPosts', $project));

我仍然不知道为什么门方法不起作用。

答案 2 :(得分:0)

我有同样的问题。 我将Gate::denies()替换为Gate::allows()。 我不确定为什么,但这对我有用。老实说,政策框架有些棘手

答案 3 :(得分:0)

首先,检查以登录到您的项目,然后由于登录到项目时的工作门而停止工作。