Laravel中间件不限制路由访问

时间:2017-01-26 17:47:17

标签: php laravel

我创建了一个中间件,只有当用户拥有角色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',
]);
});
});

当角色不是客户端时,它不应该让路由访问,但确实如此。

编辑从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',
]);
});

我在这里犯的可能是什么错误。在面试官中间件中使用=并在客户端中间件中使用==而在完成后不工作时,它可以正常工作。

2 个答案:

答案 0 :(得分:3)

由于您正在检查角色,请更改此信息:

$user->role = 'client'

对此:

$user->role == 'client'

答案 1 :(得分:3)

我找到了一个名为 Yoda条件的好习惯,以避免将来出现此类问题。

中的

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

反而做

$user->role == 'client'

DO

'client' == $user->role

这样做的好处是,如果您错误地键入=而不是==,则$user->role不会被赋予值client。所以你可以避免意外的行为。

详细了解To Yoda or Not to Yoda