7

我有一个使用tymon/jwt-auth包对 JWT 用户进行身份验证的中间件:

public function handle($request, \Closure $next)
{
    if (! $token = $this->auth->setRequest($request)->getToken()) {
        return $this->respond('tymon.jwt.absent', 'token_not_provided', 400);
    }

    try {
        $user = $this->auth->authenticate($token);
    } catch (TokenExpiredException $e) {
        return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]);
    } catch (JWTException $e) {
        return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]);
    }

    if (! $user) {
        return $this->respond('tymon.jwt.user_not_found', 'user_not_found', 404);
    }

    $this->events->fire('tymon.jwt.valid', $user);

    return $next($request);
}

然后我有一个控制器,我想将用户从中间件传递给控制器​​。

所以我在控制器上做了:

public function __construct()
{
    $this->user = \Auth::user();
}

问题是$this->usernull但是当我在控制器的方法上执行此操作时,它不为空。

所以:

public function __construct()
{
    $this->user = \Auth::user();
}

public function index()
{
    var_dump($this->user); // null
    var_dump(\Auth::user()); // OK, not null
}

所以问题是__construct在中间件之前运行。我该如何改变它,或者你有其他解决方案吗?

更新:我正在使用dingo/api进行路由,也许这是他们一方的错误?

4

2 回答 2

1

您应该在路由中使用中间件

Route::middleware('jwt.auth')->group(function() {
// your routes 
});
于 2020-06-19T17:20:08.990 回答
0

1)从你的内核$middleware阵列中删除你的中间件

2)将您的中间件放入$routeMiddleware具有自定义名称的数组中jwt.auth

protected $routeMiddleware = [
    // ...
    'jwt.auth' => 'App\Http\Middleware\YourAuthMiddleware'
];

2)在needle控制器的父目录下创建BaseController,功能:

public function __construct() {
    $this->middleware('jwt.auth');
}

3) 从 BaseController 扩展针控制器

4) 使指针控制器的 __construct 函数看起来像这样:

public function __construct() {
    parent::__construct();
    $this->user = \Auth::user();
}
于 2016-04-13T19:56:55.477 回答