Есть ли у Laravel какая-либо встроенная функция для создания ошибки разрешения?

#php #laravel-4

#php #laravel-4

Вопрос:

Прямо сейчас, когда пользователь пытается сохранить / отредактировать что-то, чего он не должен (возможно, путем взлома формы для отправки определенных данных), я прерываю работу с помощью 403:

 public function store() {
    $data = $_POST;

    if(!array_key_exists('company_id',$data)) {
        $data['company_id'] = Auth::user()->company_id;
    }

    if(!(Auth::user()->hasRole('super') || $data['company_id'] == Auth::user()->company_id)) App::abort(403,"Cannot edit customers that do not belong to your company");
    ...
  

Нет какого-то исключения, которое я мог бы создать вместо этого, не так ли? Мне не нравится везде жестко кодировать «403», и я не уверен, что это лучшее, что можно сделать.

Я думаю, что хотел бы отправить пользователя на какую-то страницу с ошибкой, которая ругает их за плохое поведение и где-то регистрирует попытку взлома.

Ответ №1:

Обычно я бы делал это с помощью фильтра маршрута. Это позволяет проверить, передан ли auth, прежде чем он даже достигнет маршрута. Вы бы добавили что-то вроде следующего в application/routes.php файл:

 Route::filter('company', function()
{
  if(!(Auth::user()->hasRole('super') 
       || Input::get('company_id', Auth::user()->company_id)
          == Auth::user()->company_id)) {
     //do stuff to log that this happened
     return Redirect::to('your_error_page');
  }
});

Route::any('store', array('before' => 'company', function()
{
   //this would be your function "store"
   return View::make('store');
});
  

Итак, что это говорит о вашем маршруте магазина, прежде чем мы его запустим, мы сначала убедимся, что он проходит фильтр «company», который проверяет, есть ли у них роль «super» или если отправленный company_id равен идентификатору компании пользователя (или если они не отправилиcompany_id, мы по умолчанию присваиваем ему идентификатор компании пользователя, и в этом случае мы знаем, что он пройдет).

Если он не проходит фильтр, мы регистрируем, что это произошло любым удобным для вас способом, а затем перенаправляем их на страницу с ошибкой.

Но теперь, в любое время, когда вы хотите убедиться, что условие company_id выполнено, вы можете просто добавить «company» в «before» часть маршрута.