如何根据用户的角色将目标用户重定向到不同的路由?

时间:2015-06-23 20:34:49

标签: laravel laravel-5

我想根据用户的角色将用户重定向到不同的路线。我的应用程序中有两个安全区域," admin"和"仪表板"。我想检查用户是否经过身份验证,然后重定向到预期,但如果用户有角色编辑器,则应将其重定向到仪表板,否则如果他有角色,则应重定向到管理区域。

我在登录时使用了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);
}

3 个答案:

答案 0 :(得分:7)

您可以覆盖redirectPath中特征使用的AuthController方法,以注入您需要的逻辑。像这样:

/**
 * 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());

这会尝试将用户重定向到之前尝试过的网址。

如果您需要在用户登录后将其重定向到正确的位置,最好通过向身份验证中间件添加更多逻辑来实现。

答案 1 :(得分:2)

  

另一种方法是覆盖authenticated方法

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

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