当前位置: 首页 > 知识库问答 >
问题:

处理程序类中的错误-Laravel

马正初
2023-03-14

我正在使用Laravel 5.5,并试图实现用户和管理员的多重身份验证。我得到这个错误时,我试图调用管理员登录表单在浏览器。

错误:

声明应用\Exceptions\Handler::未经身份验证($请求,应用\Exceptions\身份验证异常$异常)应与Illumate\Foundation\Exceptions\Handler兼容::未经身份验证($请求,Illumate\Auth\身份验证异常$异常)

这是我在app/Exceptions/Handler中未经验证的函数:

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

请帮我解决这个问题。

共有3个答案

微生俊
2023-03-14

谢谢你最近的回答Thanh Nguyen。我的自定义身份验证中间件使用最新版本

 if (Arr::first($this->guards) === 'admin') {
       return route('admin.login');
  }
 return route('customer.login');

以前在Handler.php中使用未经验证的函数来替换父函数。

 protected function unauthenticated($request, AuthenticationException $exception)
{
    $guard = Arr::get($exception->guards(), 0);
    switch ($guard) {
      case 'respondent':
      $login = 'respondents.login';
      break;
      case 'admin':
      $login = 'admin.login';
      break;
      default:
      $login = 'admin.login';
      break;
    }

    return $request->expectsJson()
                ? response()->json(['message' => $exception->getMessage()], 401)
                : redirect()->guest(route($login));
}

这两种方法都有效,但最新版本的array_get可能存在问题,无法获得我们使用的防护:

$guard = array_get($exception->guards(), 0);

对于任何面临此问题的人,Laravel 7都不推荐使用此方法。*及以上

吴英武
2023-03-14

我正在使用Laravel 7。X
我更喜欢在验证中间件中这样做
我这样做了,它对我很有效。

namespace App\Http\Middleware;

use Closure;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Support\Arr;

class Authenticate extends Middleware
{
    protected $guards = [];
     /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @param  string[] ...$guards
     * @return mixed
     *
     * @throws \Illuminate\Auth\AuthenticationException
     */
    public function handle($request, Closure $next, ...$guards)
    {
        $this->guards = $guards;

        return parent::handle($request, $next, ...$guards);
    }
    /**
     * Get the path the user should be redirected to when they are not authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string|null
     */
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            if (Arr::first($this->guards) === 'admin') {
                return route('admin.login');
            }
            return route('trainee.login');
        }

    }

}
艾宁
2023-03-14

您忘记在文件顶部添加使用illumb\Auth\AuthenticationException

 类似资料:
  • 问题内容: 反正有一起禁用laravel错误处理程序吗? 我想简单的显示 标准的PHP错误 , 没有 了错误。 问题答案: 并非没有主要违反框架原理的问题(如果您仍然感兴趣,我将在下面告诉您如何做)。 有一些事情使这很难完成。取消默认错误和异常处理程序很容易 但这给您带来两个主要障碍。 第一个是Laravel在其引导过程中注册了一个关闭处理程序,该关闭功能将查找最后一个错误,如果是致命错误,请手动

  • 所以我在这里和其他地方读到了成千上万的帖子,但对我来说仍然不起作用。其错误可能是找不到引用的类sun。杂项。不安全,或者如果我在上面使用dontwarn,它会编译,但gson部分会在某个时候返回ClassCastExecOption。 现在-我知道序列化的类在proGuard设置中被标记为-保持,我知道-保持属性注释和签名,但是我仍然不能正确地混淆我的代码。 附加我的proguard项目。txt

  • 问题内容: 当我的网站是100%jQuery时,我曾经这样做: 为401错误设置全局处理程序。现在,我将angularjs与和一起使用,以向服务器发送(REST)请求。有什么办法可以类似地用角度设置全局错误处理程序吗? 问题答案: 我还在建立一个带有angular的网站,并且遇到了同样的障碍来处理全局401。当我遇到此博客文章时,我最终使用了HTTP拦截器。也许您会发现它和我一样有用。 “基于An

  • 问题内容: 与其他框架相比,Node.js + Express.js应用程序中的错误报告/处理似乎有所不同。我理解它的工作原理是否正确? A) 通过接收错误作为回调函数的参数来 检测 错误。例如: B) 通过调用next(err) 报告 MIDDLEWARE中的​​错误。例: C) 通过抛出错误来 报告 路由中的错误。例: d) 手柄 通过配置通过app.error自己的错误处理的错误()或使用通

  • 问题内容: 如何使用 自定义* 错误处理程序处理 解析 和 致命 错误? * 问题答案: 简单答案:不能。参见手册: 用户定义的函数无法处理以下错误类型:E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,以及在调用set_error_handler()的文件中引发的大多数E_STRICT。 对