当我提交无效令牌时,Laravel中间件被“绕过”,但是当它是有效令牌时,将执行中间件

时间:2019-01-30 15:29:33

标签: laravel-5 jwt laravel-routing laravel-middleware

我所有的朋友,我有一个问题。

Route::group([
    'middleware' => ['ensure.role:store', 'auth:api']
]

为简单起见,

i have two roles : ADMIN and STORE

我创建了一个中间件来验证用户角色,如果用户角色正确,则将允许用户访问路由。

工作正常。 我尝试使用ADMIN Jwt令牌访问STORE路由,并且正确地将我踢出了主机,反之亦然。

但是现在,如果我修改令牌,可以说我在令牌的任何部分添加了一个字符串,并尝试访问任何路由,实际上我可以这样做。

我尝试了var_dump并在相关的中间件上打印了一些内容,这是我的观察结果。

1. If the token is VALID as one of the user role, then 
the var_dump is executed, (means the middleware is executed)
2. if the token is INVALID as in i add / modify the original
token, then the var_dump is not executed, and so are the 
others route middleware.

我想知道是什么原因导致这种行为,以及解决此问题的方法,因为在任何令牌无效的情况下我都需要抛出未经身份验证的401。

谢谢

1 个答案:

答案 0 :(得分:0)

我知道了。 经过一系列的测试和阅读,我发现在laravel 5.3及更高版本之后,构造函数在中间件之前被调用。而且因为在我的构造函数中,我在通过中间件进行身份验证之前正在使用用户对象,所以遇到构造函数错误,因为user为null。

在构造中使用用户对象当然是一个坏习惯,但是由于使用方便,我仍然决定使用它。

使用基于闭包的中间件作为替代解决方案听起来很复杂

所以我使用了一种解决方法。

我创建了一个辅助函数,如果有用户对象,则该函数返回true或返回abort(401);如果没有用户对象,则将这一行添加到所有构造函数中。

$this->checkAccess = EnsureRoleUtil::check('admin');

在那之后,我照常做我的下一个构造函数

public function __construct() {
    $this->checkAccess = EnsureRoleUtil::check('admin');

    $this->user = Auth::user();
    $this->categoryM = new CategoryManager($this->user);
}

但是,要注意的是,这不是一个好习惯,这只是一个hack /解决方法。