2013-09-19 2 views
2

Я использую успокоительные контроллеры. Мне нужно запустить некоторые фильтры, такие как auth и пользовательские разрешения на них. Поэтому я помещаю их в группу маршрутов и устанавливаю фильтры в этой группе. Кроме того, я также хочу запускать фильтр csrf, но только на почтовых запросах. Как это сделать в группе маршрутов?Фильтр Laravel по группе маршрутов, но только в почтовых запросах

Добавлен код для осветления

Route::group(array('before' => 'auth|allowed|csrf'), function() { 
    Route::controller('controller', 'SomeController'); 
    Route::controller('othercontroller', 'OtherController'); 
}); 

Я хочу CSRF только на почтовых маршрутах. Я действительно не хочу добавлять фильтр на каждый контроллер (их довольно много);

ответ

1

ОК. Я решил это, я думаю. Я проверил, был ли запрос опубликован или нет. Не знаю, является ли это плохой практикой. Я изменил фильтр CSRF в filter.php к

Route::filter('csrf', function() 
{ 
    if (Request::getMethod() == 'POST' && Session::token() != Input::get('_token')) 
    { 
     throw new Illuminate\Session\TokenMismatchException; 
    } 
}); 
1

Вы можете иметь группы внутри группы:

Route::group(array('before' => 'session'), function() 
{ 
    Route::get('/login', array('as'=>'login', 'uses'=>'[email protected]')); 

    Route::group(array('before' => 'csrf'), function() 
    { 
     Route::post('/login', array('as'=>'login.post', 'before' => 'csrf', 'uses'=>'[email protected]')); 

     Route::group(array('before' => 'permissions'), function() 
     { 
      Route::post('/store/checkout/new/shipping/address', array('as'=>'store.checkout.shipping.address.new', 'uses'=>'[email protected]')); 
     } 
    } 
} 
10

Вы можете сделать это с контроллера при работе с находчивый маршрутизации.

public function __construct() { 
    $this->beforeFilter('csrf', array('on' => 'post')); 
} 
2

Вы можете создать собственный фильтр, который запускает стандартный CSRF фильтр, но только на запросах POST, как это ...

Route::filter('csrfIfPost', function($route, $request) { 
    if ($request->getMethod() == 'POST') 
     return $route->callFilter('csrf', $request); 
}); 

Тогда в любом месте вы хотите использовать его, используйте фильтр 'csrfIfPost' вместо 'csrf'.

Смежные вопросы