Laravel 5.6使用guard改变重定向与unauth

时间:2018-06-15 23:21:26

标签: laravel laravel-5 laravel-5.6 laravel-middleware

我有一个管理员和Laravel 5.6附带的常规网络守卫。正如我所看到的,Laravel 5.5 up已经更改了位于\ app \ Exceptions \ Exceptions.php中的Exceptions.php文件,以便该函数:

urlencode

不再存在。而且为了

  

$这 - >中间件(' AUTH:管理员&#39);

工作并重定向到管理员登录,而不是只是" / login"我需要此方法在此异常文件中。我在这里读到你可以复制它并使用它作为唯一的事情是覆盖和Laravel因某种原因删除它。但到了这一点,为了让我创建我的switch语句,使该方法看起来像这样:

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

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

  

未定义的变量:login

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

2 个答案:

答案 0 :(得分:0)

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

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

您使用$login变量并且可能未定义,因为您只为条件定义它:

if ($request->expectsJson()) {

所以为了使它起作用,你应该结束如果条件如此:

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

答案 1 :(得分:0)

如果您使用的是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;