Защита маршрута Laravel 5.1

Я создаю приложение со списком клиентов для нескольких пользователей. Каждый пользователь должен иметь доступ только к своему списку клиентов. (следующий шаг — добавить пользователям возможность разрешать другим пользователям доступ к их списку клиентов).

У меня есть приложение, настроенное для защиты списка с помощью встроенного промежуточного программного обеспечения. URL-адрес /clients показывает только список аутентифицированных пользователей. Однако я не могу понять, как защитить детали клиента.

У меня есть пользовательская модель, настроенная с hasMany на клиентах, и клиент, настроенный с ownTo на пользователе.

Как защитить URL-адрес, такой как /clients/5 , где 5 — это идентификатор клиента в моей базе данных, а URL-адрес показывает сведения о клиенте? В настоящее время любой аутентифицированный пользователь может ввести URL-адрес с идентификатором клиента и просмотреть сведения об этом клиенте. Могу выложить код, если нужно. Но я просто смотрю, чтобы меня указали в правильном направлении, чтобы понять это самостоятельно.

Изменить - дополнительная информация/код

Вот функция показа из ClientsController.php. Закомментированный бит - это неудачная попытка решить вопрос, размещенный здесь.

  public function show($id)
{
    //$client = \Auth::user()->clients()->get($id);
    $client = Client::findOrFail($id);
    return view('clients.show', compact('client'));
}

И моя модель клиента

 namespace App;

 use Illuminate\Database\Eloquent\Model;

 class Client extends Model
 {
   protected $fillable = [
    'bizName',
    'bizStreet',
    'bizCity',
    'bizZip',
    'bizEmail',
    'bizPhone',
    'bizNotes',
    'user_id'
];

/**
 * A client belongs to one user
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */
public function user()
{
    return $this->belongsTo('App\User');
}

}


person Roger Creasy    schedule 19.07.2015    source источник
comment
Не могли бы вы дополнить свой вопрос содержанием вашего маршрута ClientController@show или контроллера для маршрута /clients/{clients}? Может быть, даже вставьте свою модель Clients.   -  person CrackingTheCode    schedule 19.07.2015


Ответы (2)


Для начала вы можете использовать что-то вроде этого в своем промежуточном программном обеспечении:

public function handle($request, Closure $next)
{
    if(($request->id != $request->user()->id) and ($request->user()->is_admin != true))
    {
        exit('Nice try!');
    } 

    return $next($request);
}

Вам также может понравиться следующее: https://github.com/jenssegers/optimus

person user2094178    schedule 19.07.2015
comment
Я не уверен, как передать идентификатор вошедшего в систему пользователя из запрашивающего представления. Можете ли вы направить меня на этот бит? - person Roger Creasy; 20.07.2015
comment
$request->user() – это пользователь, вошедший в систему, $request->id – параметр маршрута, например {id}. - person user2094178; 20.07.2015

Спасибо всем, кто предложил помощь.

Я не мог заставить промежуточное ПО работать. Итак, я изменил метод show в своем контроллере, чтобы использовать оператор if в качестве фильтра.

Вот мой рабочий метод показа:

 public function show($id)
  {
    $client = Client::findOrFail($id);
    if ($client->user_id != \Auth::id())
    {
        return view('welcome');
        //TODO create unauthorized view
    }
    return view('clients.show', compact('client'));
  }
person Roger Creasy    schedule 26.07.2015