Laravel自定义身份验证过滤器

Ste*_*teB 3 php before-filter laravel-4

我已经在控制器中使用Route :: Intended('/')将标准auth过滤器添加到多个路由(假设登录成功).

filters.php:

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

控制器:

if (Auth::attempt($data, false))
{
    return Redirect::intended('/');
}
Run Code Online (Sandbox Code Playgroud)

如何创建检查特定权限的自定义身份验证过滤器(在本例中为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('/');
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*teB 5

感谢@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('/');
});
Run Code Online (Sandbox Code Playgroud)

此过滤器不需要更改我的控制器上的Login方法,该方法仍然使用Redirect :: intention('/').
关键是不要重定向管理员用户,只需让代码"落到"原始页面,只有非管理员用户被重定向.
我还在使用标准的"auth"过滤器来处理需要非管理员身份验证的页面.

我的路线使用:

'before' => 'auth'
'before' => 'admin'
Run Code Online (Sandbox Code Playgroud)

如果我删除了我的管理过滤器的第一行(我从标准的auth过滤器中复制过),我可以通过同时使用两个过滤器来获得相同的效果:

'before' => 'auth|admin'
Run Code Online (Sandbox Code Playgroud)