Auth 授權的異常捕獲

看上隔壁小花了啦發表於2022-02-11

上技師

路由中我們有使用 auth 中介軟體,所以開啟修改 App\Http\Middleware\Authenticate.php 中介軟體。

<?php

namespace App\Http\Middleware;

use Illuminate\Auth\Middleware\Authenticate as Middleware;
use App\Exceptions\AuthException;

class Authenticate extends Middleware
{
    /**
     * 重寫未授權方法
     *
     * @param $request
     * @param array $guards
     * @return void
     * @throws AuthException
     */
    protected function unauthenticated($request, array $guards): void
    {
        throw new AuthException();
    }
}

AuthException 是我自定義的異常類,最終返回的是 response 響應。

原理

App\Http\Middleware\Authenticate 繼承 Illuminate\Auth\Middleware\Authenticate,父類中有個 unauthenticated 方法,丟擲的異常是 Illuminate\Auth\AuthenticationException,我們只需要重寫這個方法就好了。
原中介軟體 App\Http\Middleware\Authenticate 中只有 redirectTo 這個方法。重寫 unauthenticated 方法後,redirectTo 就可以刪除了。

其他方法

App\Exceptions\Handler.php 中,向 render 方法中新增如下程式碼:

<?php
namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Validation\ValidationException;
use Illuminate\Auth\Middleware\Authenticate;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use App\Exceptions\AuthException;

class Handler extends ExceptionHandler
{
    ...
     public function render($request, Exception $exception)
    {
        if ($exception instanceof AuthenticationException) {
            throw new AuthException();
        }
        return parent::render($request, $exception);
    }
}

在論壇上看了也不知道是誰的文章,說 render 方法中不能過多的使用 instanceof 所以開啟原始碼簡單看了一下。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
未知的永遠是最精彩的!

相關文章