Laravel在路由组上进行过滤,但仅限于后期请求

时间:2013-09-19 16:24:11

标签: laravel laravel-4

我正在使用安静的控制器。我需要运行一些过滤器,如auth和自定义权限。所以我将它们放在路由组中并在该组上设置过滤器。另外我还想运行csrf过滤器,但仅限于发布请求。如何在路由组中执行此操作?

添加了澄清代码

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

我只想在帖子路线上使用csrf。我真的不想在每个控制器上添加一个过滤器(有很多);

4 个答案:

答案 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;
    }
});