【问题标题】:Slim post method redirect does not Work with slim MiddlewareSlim post 方法重定向不适用于 slim 中间件
【发布时间】:2016-08-15 20:12:06
【问题描述】:

大家好,我在使用 Slim 中间件时遇到了一些问题。

我创建了一个中间件,用于检查用户是否使用 Facebook 登录并拥有特定的电子邮件地址。所以现在当我使用 PHPStorm RESTful 测试工具调用 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);

那么谁能给我一个提示可能是什么问题? 我尝试将相同的中间件添加到 get Route ......它在那里工作:/奇怪的东西。

【问题讨论】:

  • SESSION是在用户点击facebook登录后创建的,并被Facebook-PHP-SDK重定向

标签: php httprequest slim


【解决方案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;

【讨论】:

  • 嗯,为什么?我用来自 fb sdk 的数据创建了一个用户对象,其中有我的电子邮件地址,所以这个条件是正确的。当我将它添加到 get 路由时,相同的中间件可以作为 excpectet 工作。
  • 当您调用 $next() 时,您的响应将被覆盖
  • 嘿,谢谢,我现在知道了,我没有在你的截图中看到回报。
【解决方案2】:

所以现在我得到了这段代码:

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());

【讨论】:

    猜你喜欢
    • 2015-08-05
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多