Laravel自定义身份验证过滤器

时间:2014-02-06 09:40:14

标签: php laravel-4 before-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('/');
    }
}

2 个答案:

答案 0 :(得分: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('/');
});

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

我的路线使用:

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

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

'before' => 'auth|admin'

答案 1 :(得分:4)

如果您想将用户重定向到另一个用户,如果他是管理员,您可以使用相同的控制器方法进行检查。

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.');
    }

});