2014-02-06 193 views
3

我已經在控制器中使用Route :: Intended('/')將幾個路由添加了標準auth過濾器(假設登錄成功)。Laravel自定義驗證過濾器

filters.php:

Route::filter('auth', function(){ 
    if (Auth::guest()) return Redirect::guest('internal/login'); 
}); 

控制器:

if (Auth::attempt($data, false)) 
{ 
    return Redirect::intended('/'); 
} 

如何去創建一個自定義的身份驗證過濾器,用於檢查特定權限(在這種情況下isAdmin)?

我已經使auth.admin過濾器與標準auth過濾器相同,以重定向到登錄頁面,但是我需要我的控制器上的第二個登錄方法還是有辦法告訴哪個過濾器(如果有)調用了控制器方法?

if (Auth::attempt($data, false)) 
{ 
    if (RouteHasAdminFilter()) 
    { 
     if (!Auth::User()->Admin) 
      return Redirect::intended('/'); 
     else 
      return Redirect::to('/'); 
    } 
    else 
    { 
     return Redirect::intended('/'); 
    } 
} 
+2

向我們展示代碼! – Andreyco

回答

5

感謝@diegofelix

如果你想要做此項檢查在其他頁面,你可以創建檢查用戶是否是admin,像這樣的過濾器。

我已經成功地寫一個過濾器:

  • 提示用戶輸入他們的憑據
  • 重定向到網頁,供非管理員用戶
  • 允許管理員用戶去原URL


Route::filter('admin', function() 
{ 

    if (Auth::guest()) return Redirect::guest('internal/login'); 

    if (Auth::check()) 
    { 
     if (!Auth::User()->Admin) 
      return Redirect::to('/'); 
    } 
    else 
     return Redirect::to('/'); 
}); 

此過濾器不需要更改我的控制器上的Login方法,該方法仍使用Redirect :: intended('/')。
這個關鍵是不是重定向爲管理員用戶,只是讓代碼「通過」到原始頁面,只有非管理員用戶被重定向。
對於需要非管理員身份驗證的頁面,我仍然使用標準的「auth」過濾器。

我的路線請使用:

'before' => 'auth' 
'before' => 'admin' 

如果我刪除我的管理員過濾器的第一行(這是我從標準的權威性過濾器複製),我可以通過使用獲得同樣的效果這兩個過濾器一起,像這樣:

'before' => 'auth|admin' 
4

如果你想將用戶重定向到一個不同的,如果他是admin,你可以做在同一個控制器方法檢查。

if (Auth::attempt($data) 
{ 
    if (Auth::user()->isAdmin()) 
     // admin 
    else 
     // not admin 
} 
else 
    // login failed 

在這種情況下,isAdmin()是User Eloquent中的一個方法,用於檢查用戶是否爲admin。爲把我在正確的軌道上

Route::filter('admin', function(){ 

    if (! Auth::user()->isAdmin()) 
    { 
     return Redirect::to('/') 
     ->withError('No Admin, sorry.'); 
    } 

}); 
+0

我只想直接訪問用戶的管理員和特定路由(如/ admin)。我可以設置一個後置過濾器來執行額外的檢查並重新執行第二次檢查嗎? – SteB