繁体   English   中英

Laravel 5.6 使用带有防护的 unauth 更改重定向

[英]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 时重定向到管理员登录时,它说

未定义变量:登录

问题是什么? 我猜它必须与 $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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM