猿问

使用 JWT 成功认证后如何触发事件

我有一个 Laravel 版本 6 应用程序。我使用JWT 包进行身份验证。


路由定义如下:


// route/api.php

Route::middleware('auth:api')->group(function () {

     Route::apiResources([

        'genders' => 'API\GenderController'

    ]);

});

在控制器内部,我有 5 个功能index、store、和。showupdatedestroy


在这些函数中运行任何代码之前,我需要为当前用户设置语言环境,如下所示:


public function index()

{

     $locale = request()->user()->lang;    

     app()->setLocale($locale);

     // Rest of the function

}

我的控制器类扩展了一个BaseController类。由于 Restful API 是无状态的,我需要在每次用户发送 API 请求时设置语言环境。现在的问题是,最好的地方在哪里,我该怎么做?


我试图在 BaseController 的构造函数中执行此操作,但似乎middleware('auth:api')尚未检查构造函数中的令牌。


另一个选项是在身份验证事件处理程序中设置语言环境。我在这里找到了 JWT 包事件列表:


// fired when the token could not be found in the request

Event::listen('tymon.jwt.absent');


// fired when the token has expired

Event::listen('tymon.jwt.expired');


// fired when the token is found to be invalid

Event::listen('tymon.jwt.invalid');


// fired if the user could not be found (shouldn't really happen)

Event::listen('tymon.jwt.user_not_found');


// fired when the token is valid (User is passed along with event)

Event::listen('tymon.jwt.valid');

如果有人可以帮助我为我定义一个处理程序,tymon.jwt.valid我将不胜感激。或者即使您有其他解决方案可以在执行index、store、show和函数update之前运行事件。destroy


慕田峪9158850
浏览 146回答 2
2回答

慕姐8265434

我可以找到一种不同的方式来访问构造函数类中的当前用户。虽然request()->user()代码在构造函数中返回 null,auth()->user()但即使在构造函数中也返回当前用户。abstract class BaseController extends Controller{    public function __construct()     {        $locale = auth()->user()->lang;        app()->setLocale($locale);    }}因此,我可以在BaseController课堂上设置语言环境。但是,我关于使用 JWT 事件的问题是开放的。另外,我想了解更多有关使用中间件的详细信息,正如@patryk-karczmarczyk 在他的回答中所建议的那样。

倚天杖

您可以在中间件中轻松完成。只需将验证用户身份的中间件放在设置位置的中间件之前。创建您的路线类并在其中注册App\Http\Kernel::$routeMiddleware然后像这样使用它:// rouite/api.phpRoute::group(['middleware' => ['auth:api', 'locale']], function () {    Route::apiResources([        'genders' => 'API\GenderController'    ]);});
随时随地看视频慕课网APP
我要回答