2017-08-02 48 views
0

我有一个拥有用户和产品的应用程序。只有产品所有者才能查看产品。Laravel只允许所有者用户访问路线

如果用户猜测产品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函数只是检查是否需要est是一个ajax请求,如果是的话返回json。

正如你所看到的,我正在使用路由模型绑定,并且正在检查授权用户是否与产品user_id相同。基本上有更好的方法来检查用户是否是产品的拥有者。

+4

使用[policies](https://laravel.com/docs/5.4/authorization#writing-policies)是做到这一点的最“方法”。 – milo526

回答

1

在Laravel中,您可以定义Policies以便为您的数据层指定ACL和访问逻辑。

例如创建类ProductPolicy:在您的控制器方法,你可以

protected $policies = [ 
    Product::class => ProductPolicy::class, 
]; 

现在:

class ProductPolicy 
{ 

    public function show(User $user, Product $product) 
    { 
     return $user->id === $product->user_id; 
    } 

} 

然后将该策略绑定到Product模型插入以下行$policies阵列AuthServiceProvider使用以下语法来授权用户执行特定操作

public function show(Product $product) 
{ 
    $this->authorizeForUser(Auth::user(), 'show', [$product]); 

    return $this->makeResponse('admin.products.product', compact('product')); 
} 

方法authorizeForUser将调用您的策略的show方法,仅当产品属于经过身份验证的用户时,才会返回true

希望它有帮助。

相关问题