2016-08-15 106 views
1

嘿家伙我有一些Slim Middleware的问题。Slim post方法重定向不适用于超薄中间件

我创建了一个中间件,用于检查用户是否使用Facebook登录并具有特定的电子邮件地址。所以,现在当我用PHPStorm RESTful Test工具调用URL时,我不应该能够将数据发布到服务器... 但是,重定向不起作用,所以我将能够发送数据到服务器。

/** 
* Admin Middleware 
* 
* Executed before /admin/ route 
*/ 
$adminPageMiddleware = function ($request, $response, $next) { 
    FBLoginCtrl::getInstance(); 
    $user = isset($_SESSION['user']) ? $_SESSION['user'] : new User(); 
    if (!($user->getEmail() == ADMIN_USER_EMAIL)) { 
     $response = $response->withRedirect($this->router->pathFor('login'), 403); 
    } 
    $response = $next($request, $response); 
    return $response; 
}; 

/** 
* Milestone POST Method 
* 
* Create new Milestone 
*/ 
$app->post('/admin/milestone', function (Request $request, Response  $response) use ($app) { 
    $milestones = $request->getParsedBody(); 
    $milestones = isset($milestones[0]) ? $milestones :  array($milestones); 
    foreach ($milestones as $milestone) { 
     $ms = new Milestone(); 
     $msRepo = new MilestoneRepository($ms); 
     $msRepo->setJsonData($milestone); 
     if (!$msRepo->createMilestone()) { 
      return $response->getBody()->write("Not Okay"); 
     }; 
    } 
    return $response->getBody()->write("Okay"); 
})->add($adminPageMiddleware); 

所以任何人都可以给我一个提示什么问题可能是什么? 我试图添加相同的中间件到获得路线...它的工作原理:/奇怪的东西。

+0

用户点击与Facebook登录后,将创建会话,他是由Facebook的,PHP的重定向SDK –

回答

1

问题出在你的中间件逻辑上。

if (!($user->getEmail() == ADMIN_USER_EMAIL)) { 
    return $response->withRedirect($this->router->pathFor('login'), 403); //We do not want to continue execution 
} 
$response = $next($request, $response); 
return $response; 
+0

嗯,为什么?我用fb sdk中的数据创建一个用户对象,并且里面有我的电子邮件地址,所以这个条件是真的。当我将它添加到获取路径中时,相同的中间件可用作excpectet。 –

+0

当你打电话给$ next时,你的回复将被覆盖() – geggleto

+0

嘿,谢谢,我现在得到它了,我没有看到你的剪辑中的回报。 –

0

所以,现在我结束了这段代码:

class AdminRouteMiddleware 
 
{ 
 
    public function __invoke($request, $response, $next) 
 
    { 
 
     FBLoginCtrl::getInstance(); 
 
     $user = isset($_SESSION['user']) ? $_SESSION['user'] : new User(); 
 
     if (!($user->getEmail() == ADMIN_USER_EMAIL)) { 
 
      if ($_SERVER['REQUEST_METHOD'] == "GET") { 
 
       $response = $response->withRedirect('/login', 403);//want to use the route name instead of the url 
 
      } else { 
 
       $response->getBody()->write('{"error":Access Denied"}'); 
 
      } 
 
     } else { 
 
      $response = $next($request, $response); 
 
     } 
 
     return $response; 
 
    } 
 
} 
 

 

 

 
/** 
 
* Milestone POST Method 
 
* 
 
* Create new Milestone 
 
*/ 
 
$app->post('/admin/milestone', function (Request $request, Response  $response) use ($app) { 
 
    $milestones = $request->getParsedBody(); 
 
    $milestones = isset($milestones[0]) ? $milestones :  array($milestones); 
 
    foreach ($milestones as $milestone) { 
 
     $ms = new Milestone(); 
 
     $msRepo = new MilestoneRepository($ms); 
 
     $msRepo->setJsonData($milestone); 
 
     if (!$msRepo->createMilestone()) { 
 
      return $response->getBody()->write("Not Okay"); 
 
     }; 
 
    } 
 
    return $response->getBody()->write("Okay"); 
 
})->add(new AdminRouteMiddleware());