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.auth
下routes/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,
从而覆盖您的密钥。
因此,使用另一个中间件密钥是使用您自己的实现的正确方法。
我正在为一些 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.auth
下routes/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,
从而覆盖您的密钥。
因此,使用另一个中间件密钥是使用您自己的实现的正确方法。