Laravel 5.7,如何在内核中覆盖Tymon Jwt-Auth中间件?

In Laravel 5.7, How to override Tymon Jwt-Auth Middleware in Kernel?

我正在为一些 api 使用 Laravel 5.7。我还使用包 https://github.com/tymondesigns/jwt-auth 生成 JWT 令牌来验证用户。我很久以前就配置好了一切,而且运行良好。

我在routes/api_v1.php下的RouteServiceProvider.php注册了路由组:

Route::prefix('api/v1')
     ->middleware('api')
     ->namespace($this->namespace.'\API\V1')
     ->group(base_path('routes/api_v1.php'));

config.auth.php 我有 api_v1 guard with driver jwt :

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api_v1' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

我已经 App/User.php 实施了 Tymon\JWTAuth\Contracts\JWTSubject 并实施了 2 种方法。

但是在 app/Http/Kernel.php 中我添加了中间件数组:

protected $routeMiddleware = [
    // previous middlewares,
    'jwt.auth' => \App\Http\Middleware\JWTAuthenticate::class
];

jwt.authroutes/api_v1.php中的路由:

路由::中间件(['jwt.auth'])->组(函数() {

// Keep auto resource route at bottom to prevent route conflict with Show parameter route
foreach(Controller::$resourceModels as $key => $model) {
    //Route::post($key.'/{id}/patch', $model.'Controller@patchUpdate');
    Route::resource($key, $model.'Controller');
}

});

永远不会到达中间件 App\Http\Middleware\JWTAuthenticate::class 但总是转到原始的 tymon 包中间件 Tymon\JWTAuth\Http\Middleware\Authenticate::class

即使我没有在 auth.php 配置中将 api 驱动程序放入 jwt,并且我没有在中间件中放置任何 jwt.auth class 它也能正常工作使用原始中间件。

我需要的是Routes组去我自己的中间件class App/Http/Middlewares/JWTAuthenticate :

<?php

namespace App\Http\Middleware;

use Tymon\JWTAuth\Http\Middleware\Authenticate;

use Closure;

class JWTAuthenticate extends Authenticate
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     *
     * @throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException
     *
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // My own logics here
        // ...


        $this->authenticate($request);

        return $next($request);
    }
}

这样我就可以覆盖 handle 方法并先检查我自己的东西。

中间件路由组我改名了,改了

Route::middleware(['jwt.auth'])->group(function() {

Route::middleware(['jwt.authenticate'])->group(function() {

'jwt.auth' => \App\Http\Middleware\JWTAuthenticate::class

'jwt.authenticate' => \App\Http\Middleware\JWTAuthenticate::class

而原来的jwt.auth就不再调用了。我不知道为什么,但我现在可以在我的中间件中控制它。

我可以告诉你为什么会这样。

包含中间件配置的文件 app\Http\Kernel.php 在注册服务提供商之前被调用。

Tymon JWT 服务提供者随后被调用并设置中间件别名:

  • 'jwt.auth' => Tymon\JWTAuth\Http\Middleware\Authenticate::class,
  • 'jwt.check' => Tymon\JWTAuth\Http\Middleware\Check::class,
  • 'jwt.refresh' => Tymon\JWTAuth\Http\Middleware\RefreshToken::class,
  • 'jwt.renew' => Tymon\JWTAuth\Http\Middleware\AuthenticateAndRenew::class,

从而覆盖您的密钥。

因此,使用另一个中间件密钥是使用您自己的实现的正确方法。