2016-06-15 13 views
0

Angenommen, wir haben ein Benutzer- und Konversationsmodell mit einer Viele-zu-Viele-Beziehung.Laravel 5 Routenschutz

class User extends Model ... { 

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

} 


class Conversation extends Model { 

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

} 

Neben Authentifizierung (Anmeldung), die mit Laravel aus dem Kasten heraus kommt: Wie kann ich ein bestimmtes Gespräch Route für Es ist im Zusammenhang Nutzer schützen?

Welches wäre der wartungsfreundlichste Weg, dies zu erreichen? Middleware? Bewachen? Routenmodellbindung? ... gerade jetzt bin ich ein bisschen verloren ...

Antwort

2

Gute Frage. In diesem Fall empfiehlt sich die Verwendung der Laravel-Funktionen authorization. Hier sind die Unterschiede:

  1. Middleware: verwendete Logik läuft auf der Basis entweder Routen oder in/protokolliert loggten Zustand. Wenn Sie also die Gespräche vollständig von nicht angemeldeten Benutzern blockieren möchten, verwenden Sie eine Middleware.

  2. Authorization (Politik): nicht mit Authentifizierung, verwechselt wird für Fälle vorgesehen, in denen die Regeln jemand zu blockieren ist nicht auf dem Weg, sondern auf einem anderen, spezifischeren Grunde. Diese Gründe können alles Mögliche sein, von Rollen über Teams bis hin zu Eigentumsrechten. Wenn Sie eine Konversation nur für die Konversation ausblenden möchten, können Sie eine Richtlinie erstellen, mit der der Benutzer auf die vorherige Seite zurückgesetzt wird, wenn er nicht in der Konversation war.

Hier ist eine schnelle Richtlinie, die Sie erstellen können:

class ConversationPolicy { 

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

} 

Sie könnten Ihre Politik in einem Controller wie das überprüfen folgende:

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

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

Seien Sie sich bewusst sein, Sie zu binden haben werden diese Richtlinie im AuthServiceProvider, bevor sie verwendet werden kann.

+0

Danke für die gut erklärte Antwort. Klappt wunderbar. Es sollte '' '$ conv-> Benutzer-> zupfen ('id')' '' ohne Klammern rechts? – Kristo

+1

Ja. Guter Fang. Aktualisiertes Original zum Reparieren. –