簡體   English   中英

Laravel自定義身份驗證過濾器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM