2017-08-02 2 views
0

私はユーザーと製品を持つアプリケーションを持っています。製品の所有者だけが製品を見ることができるはずです。ユーザーは、製品IDを推測した場合Laravelは所有者ユーザーのみがルートにアクセスできるようにします

彼らが製品を見ることができるかもしれません。

Route::middleware(['middleware' => 'auth'])->prefix('admin')->group(function(){ 
    Route::resource('products', 'ProductController'); 
}); 

私の製品コントローラショー方法:例

http://booker.app/admin/products/32 

いずれかのIDを持つ製品を見るために、ユーザのログインが可能になるというリンクをたどるために32

これは、問題のルートは、次のとおりです。

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

使用して、[ポリシー](https://laravel.com/docs/5.4/authorization#writing-policies)これを行う最も "laravel" 方法です。 – milo526

答えて

1

Laravelでは、あなたのデータ層へのACLおよびアクセス・ロジックを指定するためにPoliciesを定義することができます。例えば

クラスProductPolicy作成:

class ProductPolicy 
{ 

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

} 

を次にAuthServiceProvider$policies配列に次の行を挿入Productモデルにポリシーをバインドします

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を返します。

希望します。

関連する問題