【问题标题】:Actions always returning unauthorised操作总是返回未经授权的
【发布时间】:2019-10-24 23:54:51
【问题描述】:

我正在创建一个简单的电子商务网站作为个人项目。

我有一个products 表,它在用户列出的每个产品之间建立关系。

$table->foreign('owner_id')->references('id')->on('users')->onDelete('cascade');

关系按预期工作,每个产品都分配有一个owner_id,等于列出该产品的用户 ID。我检查了 PHPMyAdmin 中的数据库,每次都指向正确的用户。

我使用 artisan 生成了一个策略并将我的模型指向它,以便使用自动路由模型绑定

php artisan make:policy productsPolicy --model=products
public function canView(User $user, products $product)
{
    return $product->owner_id == $user->id;
}

我的 AuthServiceProvider 指向相关政策

protected $policies = [
    'App\Model' => 'App\Policies\productsPolicy',
];

然后我在我的控制器中引用该政策,只允许创建者删除他们的列表

public function destroy(products $product)
{
    $this->authorize('canView', $product);
    $product->delete();

    return redirect('/');
}

无论我是否以创建项目的用户身份登录,都会抛出以下异常

AccessDeniedHttpException

【问题讨论】:

  • 关于命名约定的旁注; products 是一个错误的模型名称。模型是单数的(“A Product”,复数“Products”的一个实例)和StudlyCase,所以products 应该是Product。与productsPolicy 相同;应该是ProductsPolicy(类名也是StudlyCase)。请注意,这不会破坏任何东西,只是为了保持一致性而需要注意的事情。

标签: laravel laravel-5 eloquent


【解决方案1】:

您没有正确注册您的保单

protected $policies = [
    'App\Model' => 'App\Policies\productsPolicy', // 'App\Model' probably isn't a model
];

应该是

protected $policies = [
    'App\products' => 'App\Policies\productsPolicy',
];

或导入类

use App\Policies\productsPolicy;
use App\products;

protected $policies = [
    products::class => productsPolicy::class,
];

【讨论】:

  • 非常感谢 :) 我在 App\products 正确注册了我的保单
  • 作为旁注,正如蒂姆刘易斯指出的那样,您的课程命名非常糟糕,因此非常混乱。例如,您使用products 作为模型,但User 也应该是ProductProductPolicy
  • 我完全同意。这是我的第一个 laravel 项目,我只意识到我的命名约定需要认真工作。我在没有 MVC 经验的情况下进入它。我现在会全部更改,但是根据我设置的文件数量,我觉得好像需要花费几个小时才能让一切恢复正常
猜你喜欢
  • 1970-01-01
  • 2020-04-19
  • 2014-07-03
  • 2018-05-19
  • 2013-02-26
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多