流明中间件排序(优先级)

Posted

技术标签:

【中文标题】流明中间件排序(优先级)【英文标题】:Lumen middleware sort (priority) 【发布时间】:2019-05-21 11:49:48 【问题描述】:

我正在使用"laravel/lumen-framework": "5.7.*"

我有两个中间件,第一个 AuthTokenAuthenticate 应该应用于所有路由,所以它在 bootstrap/app.php 中定义

$app->middleware([
    App\Http\Middleware\AuthTokenAuthenticate::class
]);

另一个中间件的定义类似于

$app->routeMiddleware([
    'auth.token' => Vendor\Utilities\Middleware\AuthToken::class
]);

并且只会应用于某些特定的路由。

我需要先执行auth.token,然后是AuthTokenAuthenticate,但我找不到这样做的方法,因为Lumen 先执行$app->middleware 路由。

Laravel 有 $middlewarePriority 这正是我需要的,但我如何在 Lumen 中处理它?

【问题讨论】:

如果不对 Lumen 路由代码进行大量修改,我认为这很难做到。您会看到,Laravel 首先收集和排序所有中间件,Lumen 首先运行全局中间件,然后才检查它是什么路由。 这个问题的任何答案对您有帮助吗? ***.com/questions/31065936/… 【参考方案1】:

到目前为止,使用 Lumen v6(可能更早),您可以在定义路由时将中间件指定为数组字段。在路由文件web.php 中,我有如下内容:

$router->get('/api/path/to/thing', [
    'uses' => 'FooController@index',
    'middleware' => ['etag', 'caching', 'bar']
]);

请注意middleware 字段如何是一个包含三个元素的数组。调用此路由时,中间件etag 将首先执行,然后是caching,然后是bar,按此顺序执行。当您只有一个中间件类时,您可以将其指定为纯字符串或仅包含一个元素的数组。这当然可以扩展到route groups,这样你就有了一整类路由都按这个顺序使用这个中间件。

【讨论】:

Lumen 总是可以做到这一点,但是你只能处理命名路由,而不是像我提供的示例中定义的应用于所有路由的路由【参考方案2】:

我认为这在 Lumen 中不可能以您想要的方式实现。我的建议是在 router group middleware options 旁边使用中间件。


移除全局中间件注册

/bootstrap/app.php

$app->middleware([
    //App\Http\Middleware\AuthTokenAuthenticate::class
]);

将两个中间件添加到路由中间件

/bootstrap/app.php

$app->routeMiddleware([
    'auth.token' => Vendor\Utilities\Middleware\AuthToken::class,
    'auth.token.authenticate' => App\Http\Middleware\AuthTokenAuthenticate::class
]);

创建两个路由组:一个只包含auth.token.authenticate,一个包含auth.token auth.token.authenticate

/routes/web/php

$router->get('/', ['middleware' => 'auth.token.authenticate', function () use ($router) 
    // these routes will just have auth.token.authenticate applied
]);

$router->get('/authenticate', ['middleware' => 'auth.token|auth.token.authenticate', function () use ($router) 
    // these routes will have both auth.token and auth.token.authenticate applied, with auth.token being the first one
]);

我认为这是获得预期效果的最干净的方法。

【讨论】:

那么,按照你的例子,对于第二组路由,中间件会按照先auth.token,然后auth.token.authenticate的顺序执行吗? 这不是一个选项,好像我将开始拥有更多需要应用于所有路由的中间件,通过所有路由列表并将其添加到每个路由都不是一个好的解决方案 最初的问题只提到了两个中间件。如果您以后要添加越来越多的中间件,那么我同意这不是一个可行的解决方案。但是,Lumen 对这种情况不提供任何支持。我的建议是寻找或编写自己的包来提供所需的功能。

以上是关于流明中间件排序(优先级)的主要内容,如果未能解决你的问题,请参考以下文章

流明:启用 CORS

如何在带警卫的流明中实现多重身份验证?

在没有数据库队列驱动程序的情况下完成流明作业调度

在流明的 AWS SQS 中实施优先级(高、中、低)

初识java集合——队列

如何实现:左右固定,中间自适应布局,中间栏优先加载?