Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 如何根据目标用户的角色将其重定向到不同的路由?_Laravel_Laravel 5 - Fatal编程技术网

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

Laravel 如何根据目标用户的角色将其重定向到不同的路由?,laravel,laravel-5,Laravel,Laravel 5,我想根据用户的角色将其重定向到不同的路由。我的应用程序中有两个安全区域,“管理员”和“仪表板”。我想检查用户是否经过身份验证,然后重定向到预定的,但若用户有角色编辑器,那个么它应该重定向到仪表板,否则若他有角色admin,那个么应该重定向到admin区域 我正在登录中使用AuthenticatesAndRegistersUsers类。我的自定义控制器上有: /** * The default redirecTo path. * */ protected $redirectTo = '/

我想根据用户的角色将其重定向到不同的路由。我的应用程序中有两个安全区域,“管理员”和“仪表板”。我想检查用户是否经过身份验证,然后重定向到预定的,但若用户有角色编辑器,那个么它应该重定向到仪表板,否则若他有角色admin,那个么应该重定向到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);
}

您可以覆盖
AuthController
中trait使用的
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

如果您需要在用户已经登录时将其重定向到正确的位置,那么最好向您的身份验证中间件添加更多逻辑

另一种方法是重写
authenticated
方法


我用这个。您还需要修改中间件重定向验证,使其不会路由回家。只是到不同用户的仪表板

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

这应该可以,但是如果我想重定向到完整路径呢?例如:用户尝试转到“admin/settings/general”,被重定向到登录,他登录,然后被重定向到/admin,而不是完整路径。默认情况下,Laravel将首先尝试重定向到预期的URL。如果没有,它将返回到此方法。我应该在中间件上设置重定向url?您需要将
redirectPath
方法放入
AuthController
中,并根据您的需要修改逻辑。这里的问题似乎是由于委托::routeNeedsRole('admin*',数组('admin'),重定向::guest('auth/login');未正确设置预期url的。
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');
             }   
}