Laravel 5.6 更改带有 unauth 和 guards 的重定向

Laravel 5.6 Changing redirect with unauth with guards

我有一个管理员和 Laravel 5.6 附带的常规网络防护。正如我所见,Laravel 5.5 up 已经更改了位于 \app\Exceptions\Exceptions.php 中的 Exceptions.php 文件,因此函数:

   /**
     * Convert an authentication exception into an unauthenticated response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Auth\AuthenticationException  $exception
     * @return \Illuminate\Http\Response
     */
    protected function unauthenticated($request, AuthenticationException $exception)
    {
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }

        return redirect()->guest('/login');
    }
}

已经不存在了。为了

$this->middleware('auth:admin');

工作并重定向到管理员登录,而不仅仅是“/登录”我需要这个方法在这个异常文件中。我在这里读到,您可以复制它并使用它,因为它所做的唯一事情就是覆盖并且 Laravel 出于某种原因将其删除。但关键是,为了让我的 switch 语句使方法看起来像这样:

protected function unauthenticated($request, AuthenticationException $exception)
    {
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);

            $guard = array_get($exception->guards(), 0);
            switch($guard) {
                case "admin":
                    $login = "admin-login";
                    break;
                default:
                    $login = "login";
                    break;
            }
        }

        return redirect()->guest(route($login));
    }

但是当尝试加载以查看它是否在转到 /admin/login 时重定向到管理员登录时,它说

Undefined variable: login

问题是什么?我猜它必须对 $guard 做些什么,但我不确定。非常感谢任何帮助!

嗯,上面代码中的问题很明显。

return redirect()->guest(route($login));

您使用了 $login 变量,它可能没有被定义,因为您只为条件定义它:

if ($request->expectsJson()) {

所以为了让它工作,你应该像这样结束 if 条件:

if ($request->expectsJson()) {
    return response()->json(['error' => 'Unauthenticated.'], 401);
}

$guard = array_get($exception->guards(), 0);
switch($guard) {
    case "admin":
        $login = "admin-login";
        break;
    default:
        $login = "login";
        break;
}

return redirect()->guest(route($login));

当然上面的代码其实太长了,可能只是:

if ($request->expectsJson()) {
    return response()->json(['error' => 'Unauthenticated.'], 401);
}

$login = array_get($exception->guards(), 0) == 'admin' ? 'admin-login' : 'login' 

return redirect()->guest(route($login));

如果您使用的是更高版本的 laravel (7.x),您可能会因为一些弃用而出现一些错误,例如;

    如前所述,
  1. Laravel 已删除位于 App\Exceptions\Exceptions.php 的 Exceptions.php 文件。

  2. array_get($exception->guards(), 0) 方法已被弃用。

因此,要使其正常工作,请将以下代码复制并粘贴到 App\Exceptions\Handler.php 文件的底部;

protected function unauthenticated($request, AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }


    // Checks if the guard is 'admin', 'superuser' else it returns the default
    $guard = Arr::get($exception->guards(), 0);

    switch ($guard) {
        case 'admin':
            $login = 'admin.login';
            break;

        case 'superuser':
            $login = 'super.login';
            break;

        default:
            $login = 'login';
            break;
    }

    return redirect()->guest(route($login));
}

此外,不要忘记在 Handler.php 文件的顶部包含命名空间以及这些特定的导入,这样才能正常工作。

namespace App\Exceptions;

use Illuminate\Support\Arr;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;