Проверете маршрута през Slim Middlewhere

Имам следния маршрут:

$app->get('/manager/:page', $authenticate($app), function ($page) use ($app, $secretshibe) {
  $app->render('manager/pages/' . $page . '.php', ['user' => $secretshibe->get_page($page, $app->view()->getData('user'))]);
});

за изобразяване на потребителите. Използвам $authenticate за проверка на потребителското влизане, което е както следва:

$authenticate = function ($app) use ($secretshibe) {
  return function () use ($app, $secretshibe) {
    if (!isset($_SESSION['user'])) {
      $_SESSION['urlRedirect'] = $app->request()->getPathInfo();
      $app->flash('error', 'Please login to see that page');
      $app->redirect('/login');
    }
  };
};

Това, което трябва да направя, има друга логическа проверка, която проверява дали потребителят е платил. Това може да се получи от $secretshibe->check_payment($username), което връща bool, така че крайната ми функция изглежда така.

$authenticate = function ($app) use ($secretshibe) {
  return function () use ($app, $secretshibe) {
    if (!isset($_SESSION['user'])) {
      $_SESSION['urlRedirect'] = $app->request()->getPathInfo();
      $app->flash('error', 'Please login to see that page');
      $app->redirect('/login');
    }
    if (!$secretshibe->check_payment($_SESSION['user'])) {
      $app->flash('error', 'Your account has been marked as unpaid. Please pay to continue usage.');
      $app->redirect('/manager/payment');
    }
  };
};

Проблемът е, че когато пренасочва към /manager/payment, той използва същата функция за маршрут, която проверява удостоверяването по същия начин. Това води до блокиране на страницата в цикъл на пренасочване. За да спра това, трябва да проверя дали исканият маршрут е /manager/payment преди пренасочване.

Тъй като функцията $authenticate се извиква като междинен софтуер, тя се извиква преди функцията route, което означава, че не мога просто да й предам $page. Кой е най-добрият начин за предотвратяване на този цикъл на пренасочване?


person Benedict Lewis    schedule 07.04.2014    source източник


Отговори (2)


Искате да регистрирате $authenticate като Hook, а не като междинен софтуер за маршрут.

$app->hook('slim.before.dispatch', $authenticate($app));

Като алтернатива можете да използвате персонализиран междинен софтуер, за да регистрирате куката. Правил съм го в доста проекти. Може да изглежда така:

class MyMiddleware extends \Slim\Middleware
{
    public function call()
    {
        $app = $this->app;

        $authenticate = function ($app) use ($secretshibe) {
            // ... snip ...
        }

        $app->hook('slim.before.dispatch', $authenticate($app));

        $this->next->call();
    }
}

Ето скорошен Пример за използване на Middleware за регистриране на кука от един от моите лични проекти.

person Jeremy Kendall    schedule 08.04.2014

сигурни ли сте, че имате нужда от затваряне във вашия междинен софтуер? можете да получите формуляр за приложение \Slim\Slim::getInstance().

Също така мидълуерът на маршрута предаде един аргумент, съответстващият маршрут.

$authenticate = function ($route) use ($secretshibe) {
    // get the app instance
    $app = \Slim\Slim::getInstance();

    if (!isset($_SESSION['user'])) {
      $_SESSION['urlRedirect'] = $app->request()->getPathInfo();
      $app->flash('error', 'Please login to see that page');
      $app->redirect('/login');
    }

    if ($route->getName() !== '/manager/payment' && !$secretshibe->check_payment($_SESSION['user'])) {
      $app->flash('error', 'Your account has been marked as unpaid. Please pay to continue usage.');
      $app->redirect('/manager/payment');
    }
};

$app->get('/manager/:page', $authenticate, function ($page) use ($app, $secretshibe) {
  $app->render('manager/pages/' . $page . '.php', ['user' => $secretshibe->get_page($page, $app->view()->getData('user'))]);
});
person MamaWalter    schedule 07.04.2014