2016-08-15 53 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());