我有一个包含用户和产品的应用程序。只有产品所有者才能查看产品。
如果用户猜到产品ID,他们可能会查看该产品。例如
http://booker.app/admin/products/32
以下链接将允许任何登录用户查看ID为32的产品。
这是有问题的路线:
Route::middleware(['middleware' => 'auth'])->prefix('admin')->group(function(){
Route::resource('products', 'ProductController');
});
我的产品控制器显示方法:
public function show(Product $product)
{
if($product->user_id !== Auth::user()->id){
return $this->forbidden('admin/products');
}
return $this->makeResponse('admin.products.product', compact('product'));
}
forbidden和makeResponse函数只是检查请求是否是ajax请求,如果是,则返回json。
正如您所看到的,我正在使用路由模型绑定,并且我正在检查授权用户是否与产品user_id相同。基本上有更好的方法来检查用户是否是产品的所有者。
答案 0 :(得分:2)
在Laravel中,您可以定义Policies,以便为数据层指定ACL和访问逻辑。
例如,创建班级ProductPolicy
:
class ProductPolicy
{
public function show(User $user, Product $product)
{
return $user->id === $product->user_id;
}
}
然后将政策绑定到Product
模型,将以下行插入$policies
中的AuthServiceProvider
数组:
protected $policies = [
Product::class => ProductPolicy::class,
];
现在,在您的控制器方法中,您可以使用以下语法来授权用户执行某项操作
public function show(Product $product)
{
$this->authorizeForUser(Auth::user(), 'show', [$product]);
return $this->makeResponse('admin.products.product', compact('product'));
}
方法authorizeForUser
将调用您的策略的show
方法,仅当产品属于经过身份验证的用户时,才会返回true
。
希望它有所帮助。