2016-06-15 29 views
0

多対多の関係を持つユーザーと会話モデルがあるとします。認証に加えてLaravel 5ルート保護

class User extends Model ... { 

    public function conversations() 
    { 
     return $this->belongsToMany('App\Conversation'); 
    } 

} 


class Conversation extends Model { 

    public function users() 
    { 
     return $this->belongsToMany('App\User'); 
    } 

} 

(ログイン)laravelと箱から出てきた:どのように私は、ユーザーが関連it'sための具体的な会話のルートを保護することができますか?

これを達成するために最も維持可能な方法はどれですか?ミドルウェア?ガード?ルートモデルバインディング? ...今私は少し失われています...

答えて

2

良い質問。この場合は、Laravelのauthorizationの機能を使用するのが最適です。

  1. ミドルウェア:どちらかのルートに基づいて、または/状態をログアウトしてログインしてロジックを実行するために使用ここでは違いがあります。したがって、ログインしていないユーザーから会話を完全にブロックする場合は、ミドルウェアを使用します。

  2. 許可(ポリシー):認証と混同しないように、誰かをブロックするルールは、ルート上ではなく、他のいくつかの、より具体的な理由に基づくものではない例を対象としています。これらの理由は、役割からチーム、エンティティの所有権など、何でもかまいません。会話を会話内のユーザーだけに非表示にしたい場合は、会話中でない場合は、そのユーザーを前のページに戻すポリシーを作成できます。ここで

は、あなたが作成することがあります迅速な政策だ:

class ConversationPolicy { 

    public function view(User $user, Conversation $conv) { 
     return in_array($user->id, $conv->users->pluck('id')); 
    } 

} 

あなたは、次のようにコントローラで自分のポリシーをご確認できます。

if($request->user()->can('view', $conversation)) 
{ 
    return view('conversation', ['conversation' => $conversation]); 
} 

return back()->withError('You are not authorized to view this conversation'); 

はちょうどあなたがバインドする必要があります注意してくださいAuthServiceProviderのこのポリシーを使用する前に

+0

よく説明された答えをありがとう。魅力のように動作します。それは '' $ conv-> users-> pluck( 'id') '' 'かっこのない権利でなければなりません。 – Kristo

+1

良いキャッチ。修正するためにオリジナルを更新しました。 –

関連する問題