过滤后的Laravel触发路径

时间:2014-04-01 18:27:47

标签: php laravel

我构建了一个过滤器,用于检查发送的一些密钥和ID,然后给出或不去。问题是Laravel中的过滤器应该返回一个字符串,而我只是想要返回一个布尔值并让它触发预定的路径。

过滤器:

Route::filter('api_checkauth', function($route)
{
  //user"ok"
    $user_id = (int) $route->getParameter('user_id');

    $sig = $route->getParameter('sig');

    $user = User::find($user_id);

    if($user) {
      //user email
      $email = $user->email;
      //user api key
      $api_key = $user->api_key;
      //recreate signature

      $_sig = hash_hmac("sha256", $email . $user_id, $api_key);

      if($_sig === $sig) {
          return Response::json(array("message"=>"Request Ok"),200);
      } else {
          return Response::json(array("message"=>"Request Bad"),400);
      }
    } else {
      return Response::json(array("message"=>"Request not authorized"),401);
    }

});

路线:

// Route group for API versioning
Route::group(array('prefix' => 'api/v1', 'before' => 'api_checkauth'), function()
{

    Route::get('/pim/{user_id}/{sig}', 'MoreOrLessController@index');
});

所以问题是,我怎样才能触发我在群组中定义的路线?因为现在发生的事情是只打印一条消息而不是应该触发的控制器方法。

由于

2 个答案:

答案 0 :(得分:1)

在Laravel中,如果过滤器返回响应,则该响应被视为对请求的响应,并且不执行路由。因此,只有在用户未获得授权的情况下才能执行路由才能返回响应。

if($user) {

  $email = $user->email;

  $api_key = $user->api_key;

  $_sig = hash_hmac("sha256", $email . $user_id, $api_key);

  if($_sig !== $sig) {

    return Response::json(array("message"=>"Request Bad"),400);
  }

} else {

  return Response::json(array("message"=>"Request not authorized"),401);
}

答案 1 :(得分:1)

答案是您在错误的地方返回200 HTTP响应。

正如您所指出的,由于if / else语句的结构,无论发生什么情况,您都将始终从过滤器获得JSON字符串响应。

不要在过滤器中返回200响应,而是在MoreOrLessController @ index操作中处理它。因此,澄清一下,当您确认$ _sig === $ sig *时,*不会在过滤器中返回任何内容。

应该这样做!