Slim PHP 框架中间件自定义 URL 过滤器

Slim PHP Framework middleware custom URL filter

我正在使用 Slim Framework 创建 API。我需要过滤请求所需的身份验证并将它们路由到特定的身份验证处理程序。或者说我需要过滤不需要auth(public信息)的URI会更好。

我创建了以下中间件 skileton

class TokenAuth extends \Slim\Middleware {
    private $auth;
    public function __construct($userEmail,$accesToken,$appSecret) {

    }

    /**
     * Deny Access
     *
     */
    public function deny_access() {
        $res = $this->app->response();
        $res->status(401);
    }


    public function authenticate($token) {
        ....
    }

    /**
     * Call
     *
     */
    public function call() {
        //Get the token sent from jquery

        $tokenAuth = $app->request->headers->get('Authorization');

        //Check if our token is valid
        if ($this->authenticate($tokenAuth)) {
        ....
        } else {
            $this->deny_access();
        }
    }

}

在这种情况下,我无法访问任何没有令牌的 URI,如何解决这个问题,允许访问 public 资源。
如果有任何帮助,我将不胜感激。提前致谢。

这里的一个常见策略是使用规则实施防火墙。

一个非常简单的防火墙可能会忽略 public 资产(即任何以 .jpg、.png、.css、.js 等结尾的内容)。规则通常只是正则表达式。

示例防火墙配置可能如下所示(注意应用规则的顺序也很重要)。

firewalls:
    # Public assets, anyone can see
    assets:
        expression: \.(js|css)$
        auth: false

    # Everything exception login requires auth
    secure:
        expression: ^(?!login$)
        auth: true

    # Everything else gets through
    public:
        expression: ^/
        auth: false

您的框架是否解析了定义并迭代了规则。从那里,您可以决定如何处理路由。

主要有两种方法:

全局中间件

一种方法是向您的 API 添加一个 OAuth 中间件,这样您就可以检查用户是否已通过身份验证并设置一个标志,然后在每个路由中您可以简单地检查用户是否已通过身份验证或没有。

<?php
$app = new \Slim\Slim();
$app-authenticated = false;
$app->add(new MyOAuthMiddleware());

然后你的 MyOAuthMiddleware :

<?php
 class MyOAuthMiddleware extends \Slim\Middleware {
  public function call() {
   //Do your OAUTH check stuff here
   $this->app-authenticated = true;
  }
}

现在您可以签入所有路线了:

<?php
$app->get('/hello/:name', function ($name) {
   $app = \Slim\Slim::getInstance();
   if($app->authenticated === true){
    echo "Hello, $name";
   } else {
    echo "You need to login";
   }
});

具体路由中间件

您可以按照 Slim documentation 并选择在每个声明中直接添加您的中间件:

<?php
$authenticateForRole = function ( $role = 'member' ) {
    return function () use ( $role ) {
        $user = User::fetchFromDatabaseSomehow();
        if ( $user->belongsToRole($role) === false ) {
            $app = \Slim\Slim::getInstance();
            $app->flash('error', 'Login required');
            $app->redirect('/login');
        }
    };
};
$app = new \Slim\Slim();
$app->get('/foo', $authenticateForRole('admin'), function () {
    //Display admin control panel
});