【问题标题】:Slim PHP Framework middleware custom URL filterSlim PHP Framework 中间件自定义 URL 过滤器
【发布时间】:2015-08-26 04:53:36
【问题描述】:

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

我创建了以下中间件框架

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,如何解决这个问题,允许访问公共资源。
如果有任何帮助,我将不胜感激。提前谢谢。

【问题讨论】:

    标签: php rest authentication middleware slim


    【解决方案1】:

    你主要有两种方法:

    全局中间件

    一种方法是在您的 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
    });
    

    【讨论】:

    • 很好的答案,如果我要检查中间件中的 URI,如果不需要登录,只需调用 next 怎么办?
    • 是的,最终可以使用 $app->request 这是 Slim\Http\Request 对象访问当前请求并进行检查。
    【解决方案2】:

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

    一个非常简单的防火墙可能会忽略公共资产(即任何以 .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
    

    你有没有框架解析定义并迭代规则。从那里,您可以决定如何处理路由。

    【讨论】:

      猜你喜欢
      • 2012-03-11
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2016-08-31
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      相关资源
      最近更新 更多