我正在使用安静的控制器。我需要运行一些过滤器,如auth和自定义权限。所以我将它们放在路由组中并在该组上设置过滤器。另外我还想运行csrf过滤器,但仅限于发布请求。如何在路由组中执行此操作?
添加了澄清代码
Route::group(array('before' => 'auth|allowed|csrf'), function() {
Route::controller('controller', 'SomeController');
Route::controller('othercontroller', 'OtherController');
});
我只想在帖子路线上使用csrf。我真的不想在每个控制器上添加一个过滤器(有很多);
答案 0 :(得分:10)
使用 资源丰富的路由 时,您可以从控制器执行此操作。
public function __construct() {
$this->beforeFilter('csrf', array('on' => 'post'));
}
答案 1 :(得分:2)
您可以创建一个运行标准CSRF过滤器的自定义过滤器,但仅限于此类POST请求...
Route::filter('csrfIfPost', function($route, $request) {
if ($request->getMethod() == 'POST')
return $route->callFilter('csrf', $request);
});
然后你想在任何地方使用它,只需使用过滤器'csrfIfPost'而不是'csrf'。
答案 2 :(得分:1)
您可以在群组中拥有群组:
Route::group(array('before' => 'session'), function()
{
Route::get('/login', array('as'=>'login', 'uses'=>'LogonController@form'));
Route::group(array('before' => 'csrf'), function()
{
Route::post('/login', array('as'=>'login.post', 'before' => 'csrf', 'uses'=>'LogonController@login'));
Route::group(array('before' => 'permissions'), function()
{
Route::post('/store/checkout/new/shipping/address', array('as'=>'store.checkout.shipping.address.new', 'uses'=>'StoreController@newShippingAddress'));
}
}
}
答案 3 :(得分:1)
行。我猜,我解决了。我检查了请求是否发布。不知道这是不好的做法。我将filter.php中的csrf过滤器更改为
Route::filter('csrf', function()
{
if (Request::getMethod() == 'POST' && Session::token() != Input::get('_token'))
{
throw new Illuminate\Session\TokenMismatchException;
}
});