【发布时间】: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