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),您可能会因为一些弃用而出现一些错误,例如;
如前所述,Laravel 已删除位于 App\Exceptions\Exceptions.php
的 Exceptions.php 文件。
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;
我有一个管理员和 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),您可能会因为一些弃用而出现一些错误,例如;
-
如前所述,
Laravel 已删除位于
App\Exceptions\Exceptions.php
的 Exceptions.php 文件。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;