Laravel - 多重身份验证的未经身份验证的重定向问题

kna*_*nat 5 php authentication guard laravel

我在 Laravel 5.7 中设置了多重身份验证系统

该站点有一个“管理”部分和一个站点的“学习者”部分。当您尝试访问任一站点的一部分时,如果您尚未登录,它会将您重定向到正确的登录页面。

但是,如果按照以下步骤操作,我会遇到重定向问题:

  1. 我尝试访问“管理员”站点的一部分(不是登录名),这会将我重定向到管理员登录名。
  2. 然后,如果我直接链接到“学习者”页面的登录部分并登录,它不会转到主页,而是将我重定向回管理员登录。

它正确地让我登录,但错误地重定向到另一个登录页面。反之亦然,如果我自动重定向到“学习者”,则问题也会发生,然后直接链接到管理员登录页面并登录。

我相信我已经将问题缩小到我放在 Exception/Handler.php 文件中的未经验证的函数,但我不知道从那里开始。

protected function unauthenticated($request, AuthenticationException $exception)
    {
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }
        $guard = array_get($exception->guards(), 0);
        switch ($guard) {
            case 'learner':
                $login = 'learner.login';
                break;
            default:
                $login = 'login';
                break;
        }
        return redirect()->guest(route($login));
    }
Run Code Online (Sandbox Code Playgroud)

使用每个单独的登录页面工作正常。只有当您按照上述流程进行操作时,我才会发现问题。

我在每个控制器中使用单独的中间件,如下所示:

管理员主控制器

public function __construct()
    {
        $this->middleware('auth');
    }
Run Code Online (Sandbox Code Playgroud)

管理员登录控制器:

public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }
Run Code Online (Sandbox Code Playgroud)

学习者家庭控制器

public function __construct()
    {
        $this->middleware('auth:learner');

    }
Run Code Online (Sandbox Code Playgroud)

学习者登录控制器:

public function __construct()
    {
        $this->middleware('guest:learner')->except('logout');
    }
Run Code Online (Sandbox Code Playgroud)

解决方案:使用 Session:forget('url.intended'); 清除预期的 url;

protected function unauthenticated($request, AuthenticationException $exception)
    {
        // dd($exception);
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }
        $guard = array_get($exception->guards(), 0);
        switch ($guard) {
            case 'learner':
                $login = 'learner.login';
                break;
            default:
                $login = 'login';
                break;
        }
        Session::forget('url.intented'); 
        return redirect()->route($login);
    }
Run Code Online (Sandbox Code Playgroud)

kna*_*nat 4

解决方案:使用 Session:forget('url.intending'); 清除预期的 url

protected function unauthenticated($request, AuthenticationException $exception)
    {
        // dd($exception);
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }
        $guard = array_get($exception->guards(), 0);
        switch ($guard) {
            case 'learner':
                $login = 'learner.login';
                break;
            default:
                $login = 'login';
                break;
        }
        Session::forget('url.intented'); 
        return redirect()->route($login);
    }
Run Code Online (Sandbox Code Playgroud)