上技師
路由中我們有使用 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 協議》,轉載必須註明作者和本文連結