繁体   English   中英

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

[英]Slim PHP Framework middleware custom URL filter

我正在使用Slim Framework创建API。 我需要过滤请求所需的身份验证,并将其路由到特定的身份验证处理程序。 或者最好说我需要过滤不需要auth(公共信息)的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,如何解决此问题,从而允许访问公共资源。
我将不胜感激。 提前谢谢。

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

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

您是否有框架来解析定义并遍历规则。 从那里,您可以决定如何处理路由。

主要有两种方法可以执行此操作:

全球中间件

一种方法是将OAuth中间件添加到您的API中,以便您可以检查用户是否通过身份验证并设置标志,然后在每个路由内可以简单检查用户是否通过身份验证。

<?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 文档,并选择直接在每个声明上添加中间件:

<?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
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM