未调用 Laravel Gate 方法

标签 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 错误。 但是,如果我不将项目作为参数传递,代码确实会被调用,但这会使它变得毫无用处。

我还想补充一点,在这种情况下,我不能使用 Policy,因为创建方法只接受一个参数($user),如果我尝试传递 $project,它会像传递 Gate 一样失败。

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

最佳答案

我也有同样的问题。当 Gate::allows() 中的第二个参数是一个 Eloquent 模型时,似乎发生了一些错误。

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

关于未调用 Laravel Gate 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44122779/

相关文章:

php - 在 Laravel 中创建一个进程来动态监听、工作或监控队列

python - 您如何控制用户对键值数据库中记录的访问?

asp.net-mvc - 如何在 MVC 项目中实现 ASP.Net 成员身份?

java - 使用 Spring Security 进行两级身份验证

php - 在Where子句中使用子查询的结果(Laravel)

mysql - 具有不同公共(public)端口的服务器会影响mysql吗?

c# - 如何在 asp.net mvc 中使用 {SiteName} 处理 [Authorize]

c# - 使用自定义消息的 MVC 3 AuthorizeAttribute 重定向

laravel - 如何使用RequiredIf验证laravel验证日期

php - Laravel 使用外墙有什么缺点吗?