#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» часть маршрута.