2015-06-23 105 views
6

我想根据用户的角色将我的用户重定向到不同的路由。我的应用中有两个安全区域,“管理员”和“仪表板”。我想检查用户是否已通过身份验证,然后重定向到预期的状态,但是如果用户有角色编辑器,则应将其重定向到仪表板,否则,如果角色管理员应将其重定向到管理员区域。Laravel 5根据角色重定向到不同的路由

我在我的登录中使用了AuthenticatesAndRegistersUsers类。我有这个我自定义控制器上:

/** 
* The default redirecTo path. 
* 
*/ 
protected $redirectTo = '/dashboard'; 

因此,当一个用户进行身份验证,将被重定向到仪表板,但我想检查目的URL是管理员组的路由,如果用户具有管理员角色它应该被重定向到管理区域。

我使用这个中间件来重定向到登录:

public function handle($request, Closure $next) 
{ 
    if ($this->auth->guest()) 
    { 
     if ($request->ajax()) 
     { 
      return response('Unauthorized.', 401); 
     } 
     else 
     { 
      return redirect()->guest('auth/login'); 
     } 
    } 

    return $next($request); 
} 

回答

6

你可能会覆盖在你的AuthController由性状所使用的redirectPath方法注入你所需要的逻辑。事情是这样的:

/** 
* Get the post register/login redirect path. 
* 
* @return string 
*/ 
public function redirectPath() 
{ 
    // Logic that determines where to send the user 
    if (\Auth::user()->type == 'admin') { 
     return '/admin'; 
    } 

    return '/dashboard'; 
} 

编辑:

Laravel使用在AuthenticatesAndRegistersUsers特点如下声明成功登录后,将用户重定向:

return redirect()->intended($this->redirectPath()); 

这将尝试将用户重定向到以前尝试的URL。

如果您需要在用户登录时将用户重定向到正确的位置,最好通过向认证中间件添加更多逻辑来完成。

+0

这应该工作,但如果我想重定向到完整路径呢?例如:用户尝试转到“admin/settings/general”,重定向到登录名,他登录后重定向到/ admin,而不是完整路径。 – Tropicalista

+0

默认情况下,Laravel会尝试首先重定向到预期的URL。如果没有一个,它会回落到这种方法。 –

+0

我应该在中间件上设置重定向网址? – Tropicalista

1

的另一种方法是重写authenticated方法

public function authenticated() 
    { 
     if(Auth::check()) { 
      if(\Auth::user()->hasRole('Super Admin')) { 
       return redirect('/admin-dashboard'); 
      } else { 
       return redirect('/user-dashbaord'); 
      } 
     }  
    } 
0

我使用这一个。您还需要修改中间件RedirectIfAuthenticated,以便它不会路由回家。仅适用于不同用户的仪表板。

public function authenticated() 
{ 
    if($request->user()->hasRole('admin')) 
      { 
       // return redirect()->intended(route('admin.index')); 
       return redirect()->route('admin.index'); 
      } 
     if($request->user()->hasRole('super')) 
      { 
       return redirect()->route('super.index'); 
      } 
     if($request->user()->hasRole('officer')) 
      { 
       return redirect()->route('officer.index'); 
      } 
}