Kei*_*DOG 0 laravel-5 laravel-middleware jwt-auth
我正在将 Laravel 5.7 用于某些 api。我还使用包https://github.com/tymondesigns/jwt-auth生成 JWT 令牌来验证用户。我很久以前就配置了所有东西,它运行良好。
我在RouteServiceProvider.php以下注册路由组routes/api_v1.php:
Route::prefix('api/v1')
->middleware('api')
->namespace($this->namespace.'\API\V1')
->group(base_path('routes/api_v1.php'));
Run Code Online (Sandbox Code Playgroud)
在config.auth.php我有带有驱动程序 jwt 的 api_v1 防护:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api_v1' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
Run Code Online (Sandbox Code Playgroud)
我已经App/User.php实现Tymon\JWTAuth\Contracts\JWTSubject并实现了这两种方法。
但是当app/Http/Kernel.php我在中间件数组中添加时:
protected $routeMiddleware = [
// previous middlewares,
'jwt.auth' => \App\Http\Middleware\JWTAuthenticate::class
];
Run Code Online (Sandbox Code Playgroud)
routes/api_v1.php组下的路线jwt.auth:
路由::中间件(['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');
}
Run Code Online (Sandbox Code Playgroud)
});
永远不会到达中间件,App\Http\Middleware\JWTAuthenticate::class但总是去原来的 tymon 包中间件Tymon\JWTAuth\Http\Middleware\Authenticate::class。
即使我没有在auth.php配置中将 api 驱动程序放入 jwt ,并且我没有jwt.auth在中间件中放入任何类,它也可以与原始中间件正常工作。
我需要的是让 Routes 组转到我自己的中间件类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);
}
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以覆盖handle方法并首先检查我自己的东西。
我可以告诉你为什么会这样。
app\Http\Kernel.php带有中间件配置的文件在注册服务提供者之前被调用。
因此,随后会调用 Tymon JWT 服务提供者并为以下各项设置中间件别名:
从而覆盖您的密钥。
因此,使用另一个中间件密钥是使用您自己的实现的正确方法。
| 归档时间: |
|
| 查看次数: |
3127 次 |
| 最近记录: |