【问题标题】:How to implement a Slim v2 hook as middleware in Slim v3如何在 Slim v3 中实现 Slim v2 挂钩作为中间件
【发布时间】:2016-05-27 15:13:33
【问题描述】:

在 Slim Framework v2 中,我使用简单的身份验证功能作为挂钩来检查路由是否需要登录。

这是验证码:

$authenticate = function ( $app ) {
    return function () use ( $app ) {
        if ( !isset( $_SESSION['userid'] ) ) {
            $_SESSION['urlRedirect'] = $app->request()->getPathInfo();
            $app->flash('danger', 'You need to login');
            $app->redirect('/login');
        }
    };
};

这就是我在 Slim v2 中的使用方式:

$app->get("/user/change-password", $authenticate($app), function () use ( $app ) {

 $userStuff->changePassowrd($_SESSION['userid'], $newPassword, $oldPassword);

});

我可以毫无问题地将它实现到 Slim v3,但我似乎无法理解我应该如何使用中间件来做到这一点(学习和使用功能)

我试过这个:这是我的中间件类;

<?php
namespace entity;

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;

class Auth
{
    /**
     * Example middleware invokable class
     *
     * @param  \Psr\Http\Message\ServerRequestInterface $request  PSR7 request
     * @param  \Psr\Http\Message\ResponseInterface      $response PSR7 response
     * @param  callable                                 $next     Next middleware
     *
     * @return \Psr\Http\Message\ResponseInterface
     */
     public function __invoke($request, $response, $next)
     {
       if ($this->authenticate()) {
        $response = $next($request, $response);
      } else {
        echo 'You need to login';
      }
      return $response;
     }

     public function authenticate() {
       if ( !isset( $_SESSION['userid'] ) ) {
          return true;
       }
       return false;
     }
}

?>

已注册:

$app->add( new entity\Auth() );

而且我不知道如何像在 Slim v2 中那样在路由上使用它,我应该在路由的哪个位置添加它以检查该路由是否需要身份验证?

谢谢。

【问题讨论】:

    标签: php oop slim middleware slim-3


    【解决方案1】:

    您正在寻找的实际上是排除 Auth 中间件的路由。 您确实希望检查所有其他路线,但不检查 changePassword

    在您的 __invoke 中,您需要 get the current route 并且仅在路线不是 changePassword 时才使用 authenticate(如果这是您的路线名称)。

    public function __invoke($request, $response, $next)
    {
        $route = $request->getAttribute('route');
        if (in_array($route->getName(), ['changePassword']) || $this->authenticate()) {
            $response = $next($request, $response);
        } else {
            echo 'You need to login';
        }
        return $response;
    }
    

    【讨论】:

      【解决方案2】:

      接下来是基本示例

      <?php
      
      require 'vendor/autoload.php';
      
      session_start();
      
      class Auth {
          public function __invoke($request, $response, $next) {
              if ($this->authenticate()) {
                  $response = $next($request, $response);
              } else {
                  echo 'You need to login';
              }
              return $response;
          }
      
          public function authenticate() {
              if (isset($_SESSION['userid'])) {
                  return true;
              }
              return false;
          }
      }
      
      $app = new \Slim\App();
      
      $app->get('/open', function($request, $response, $args){
          echo 'HAPPINESS FOR EVERYBODY, FREE, AND LET NO ONE BE LEFT BEHIND!';
      });
      
      $app->get('/closed', function($request, $response, $args){
          echo 'You are authenticated!';
      })->add(new Auth());
      
      $app->get('/login', function($request, $response, $args){
          $_SESSION['userid'] = 1;
      });
      
      $app->run();
      

      我认为 authenticate 函数作为 !isset 存在错误,这意味着没有 $_SESSION['userid'] 并且可能用户未登录并且您的函数告诉他已登录。

      但无论如何,您都可以使用add() 方法将中间件添加到单个路由或一组路由。

      【讨论】:

        猜你喜欢
        • 2022-08-03
        • 1970-01-01
        • 1970-01-01
        • 2017-03-10
        • 2016-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-08
        相关资源
        最近更新 更多