在我的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>
这是一个错误吗?是否有另一种更好的方法来实现这种功能?感谢。
答案 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)
首先,检查以登录到您的项目,然后由于登录到项目时的工作门而停止工作。