[英]Laravel custom auth filter
我已經在控制器中使用Route :: Intended('/')將標准auth過濾器添加到多個路由(假設登錄成功)。
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過濾器相同,以重定向到登錄頁面,但我是否需要在我的控制器上使用第二個Login方法,或者有辦法告訴哪個過濾器(如果有的話)調用了控制器方法?
if (Auth::attempt($data, false))
{
if (RouteHasAdminFilter())
{
if (!Auth::User()->Admin)
return Redirect::intended('/');
else
return Redirect::to('/');
}
else
{
return Redirect::intended('/');
}
}
感謝@diegofelix讓我走上正軌。
我設法編寫了一個過濾器:
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 :: intention('/')。
關鍵是不要重定向管理員用戶,只需讓代碼“落到”原始頁面,只有非管理員用戶被重定向。
我還在使用標准的“auth”過濾器來處理需要非管理員身份驗證的頁面。
我的路線使用:
'before' => 'auth'
'before' => 'admin'
如果我刪除了我的管理過濾器的第一行(我從標准的auth過濾器中復制過),我可以通過同時使用兩個過濾器來獲得相同的效果:
'before' => 'auth|admin'
如果要將用戶重定向到另一個用戶(如果他是管理員),則可以使用相同的Controller方法進行檢查。
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.');
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.