Laravel授权策略未被调用

3

我遇到了一个权限策略无法正常运行的问题,导致授权尝试始终返回false。为了测试,我甚至强制让函数返回true。我正在使用Laravel 5.4,以下是我的策略函数:

public function can_modify_or_delete(User $user, Comment $comment)
{
    return true;
}

在我的AuthServiceProvider.php文件中,我已将CommentPolicy添加到我的现有策略注册中。
protected $policies = [
    'App\Models\Post' => 'App\Policies\PostPolicy',
    'App\Models\Comment' => 'App\Policies\CommentPolicy',
];

奇怪的是,那个发布策略已经运作得很好了。评论策略似乎要么没有被注册,要么没有被正确调用。

在我的路由中:

Route::delete('/comments/{comment}', 'CommentsController@destroy');

并且在 CommentsController

public function destroy(Request $request, Comment $comment)
{   
    $this->authorize('can_modify_or_delete', $comment);
    $comment->delete();

    return response(['status' => 'Comment deleted'], 200);
}

很遗憾,无论如何,授权检查都返回false。我有什么遗漏吗?仔细检查了拼写错误,却找不到任何问题。我还确认路由模型绑定按预期工作,因此这不是空资源问题。我尝试在策略中使用dd(),但它甚至没有被调用。


你的路由是否已分组在中间件下? - user1897253
控制器使用auth:api中间件。我在控制器方法中,在授权运行之前,通过“dd()”确认了我的已验证用户。 - Collin Henderson
输出是否出现错误或者完全无法工作?同时将true改为false,观察是否产生了任何变化。 - MohamedSabil83
1个回答

8

哇,原来这是我的错字(典型!)。在我的评论模型中,我意外地将命名空间中的models小写,即:

namespace App\models;

应该是这样的:

当时应该是:

namespace App\Models;

这让我感到意外,因为在控制器中我有以下代码:
use App\Models\Comment;

destroy() 方法注入了一个注释,实际上运行良好,注释正常生成。似乎策略注册路径必须比 use 语句更加精确。


2
@Colin 这太奇怪了。我在 AuthServiceProvider.php 中没有包含我的模型的 use 语句,没有任何错误提示,但是它不起作用...一旦我包含了它...哇...你至少为我节省了一个小时 :) - AmrataB
1
我简直不敢相信我会这么说,但这正是我遇到的问题哈哈!我的“Comment”模型命名空间中的小写m而不是大写!想象一下! - John Jackson
哈哈,我也遇到了类似的问题。看到这个答案后,我想也许我的问题就像这样一个小问题。自动发现对我不起作用,因为我忘记在路由中间件中添加策略所需的模型。即我原本写成: ...->middleware('can:update')而应该是:`...->middlware('can:update,model')` - Dan Fletcher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接