2017-08-02 75 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

希望它有幫助。

相關問題