【问题标题】:Laravel middleware not restricting route accessLaravel 中间件不限制路由访问
【发布时间】:2017-06-12 07:04:27
【问题描述】:

我创建了一个中间件,它只允许具有client 角色的用户。 但是当我使用中间件时,它仍然让用户访问没有客户端角色的路由。

public function handle($request, Closure $next)
{
    $user = \Auth::user();
    if ($user && $user->role = 'client') {
        return $next($request);
    }

    return redirect('home');

}

这是我的路线。我对其他工作正常的中间件做了同样的事情。但不是这个

Route::group(['middleware'=>['auth']],function(){

Route::group(['middleware'=>['client']],function(){

   Route::get('/index',[
'as' => 'index',
'uses' => 'HomeController@showCandidates',
]);
});
});

当角色不是客户端时,它不应该允许访问路由,但确实可以。

edit 根据 alexey 的回答,我用 == 更改了我的其他中间件,上面的问题就解决了。但是即使我的角色是面试官,下面的中间件也会限制我访问路由。

public function handle($request, Closure $next)
{
    $user = \Auth::user();

    if($user && $user->roles == 'interviewer'){
        return $next($request);
    }
    return redirect('home');

}

这是我的路线

Route::group(['middleware'=>['auth','interviewer']],function(){

Route::get('/candidates', [
'uses' => 'candidateController@showProfile',
]);
});

我在这里犯的可能错误是什么。当= 用于面试官中间件和== 用于客户端中间件时,它可以正常工作,反之亦然。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    由于您正在检查角色,请更改以下内容:

    $user->role = 'client'
    

    到这里:

    $user->role == 'client'
    

    【讨论】:

    • 这是另一个问题,以后请为任何新问题创建另一个问题,这就是 SO 的工作方式。关于你的新问题,你有一个错字,应该是role,而不是roles
    【解决方案2】:

    我找到了一个很好的约定,称为 Yoda 条件,以避免将来出现此类问题。

    在你的

    if ($user && $user->role = 'client') {
        return $next($request);
    }
    

    而不是做

    $user->role == 'client'
    

    'client' == $user->role
    

    这样做的用处是,如果您错误地键入 = 而不是 ==$user->role 不会被分配值 client。这样您就可以避免意外行为。

    阅读更多关于To Yoda or Not to Yoda

    【讨论】:

    • 在 PHP 7 中,尝试将变量分配给字符串会导致解析错误,因此这是一个很好的解决方案。在条件句中使用= 是不可能的。
    猜你喜欢
    • 2017-08-13
    • 2015-03-12
    • 1970-01-01
    • 2015-08-17
    • 2018-12-22
    • 1970-01-01
    • 2017-03-06
    • 2020-01-15
    • 2019-07-10
    相关资源
    最近更新 更多