2017-01-26 41 views
1

我創建了一箇中間件,允許用戶只有在他們有角色client。 但是,當我使用中間件它仍然讓用戶訪問沒有客戶端角色的路由。Laravel中間件不限制路由訪問

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' => '[email protected]', 
]); 
}); 
}); 

當角色不是客戶端時,它不應該讓訪問路由,但它會。

編輯來自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' => '[email protected]', 
]); 
}); 

什麼是可能的錯誤我在這裏做。當在訪問中間件中使用=,在客戶端中間件中使用==,並且在反之亦然時不工作時,它正常工作。

回答

3

既然你正在檢查的作用,改變這種:

$user->role = 'client' 

要這樣:

$user->role == 'client' 
+0

看到編輯的問題@alexey mezenin –

+0

這是另外一個問題,將來請創建任何新的問題,另外一個問題,那就是如何SO工作。關於你的新問題,你有一個錯字,它應該是'角色',但不是'角色' –

+1

哦,我的。這是一個愚蠢的錯誤。謝謝 –

3

我找到了一個很好的約定叫尤達條件,以避免今後發生此類問題。

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

而不是做

$user->role == 'client' 

'client' == $user->role 

這樣做的用處是,如果你錯誤地鍵入了=代替==$user->role沒有得到分配價值client。所以你可以避免意外的行爲。

瞭解更多關於To Yoda or Not to Yoda

+0

在PHP 7中,試圖將一個變量賦值給一個字符串會導致一個解析錯誤,這是一個很好的解決方案。它使得在條件中使用'='的錯誤是不可能的。 – user3158900