2016-06-15 7 views
0

Предположим, у нас есть модель User and Conversation с отношением «многие ко многим».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: Как я могу защитить конкретный разговор маршрут для подмигнули связанные пользователь?

Какой был бы наиболее удобный способ для достижения этого? Промежуточное? Guard? Перенос модели маршрута? ... прямо сейчас я немного потерял ...

ответ

2

Хороший вопрос. В этом случае вам лучше использовать функции Laravel authorization. Вот различие:

  1. Middleware: используется для запуска логики, основанную на любых маршрутах или авторизован/логает состояние. Итак, если вы хотите полностью заблокировать разговоры от не зарегистрированных пользователей, используйте промежуточное программное обеспечение.

  2. Authorization (политика): не следует путать с аутентификации, предназначен для случаев, когда правила, чтобы заблокировать кого-то не основано на маршруте, но на какой-то другой, более конкретной причине. Этими причинами могут быть что угодно: от ролей, от команд, владения сущностями и т. Д. Если вы хотите скрыть разговор только тем, кто находится в разговоре, вы можете создать политику, которая возвращает пользователя на предыдущую страницу, если они не были в разговоре.

Вот краткий курс вы можете создать:

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

Да. Хороший улов. Обновлен оригинал для исправления. –