我已经在控制器中使用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('/');
}
}
答案 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.');
}
});