43 lines
1.6 KiB
PHP
43 lines
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\QueryException;
|
|
use Laravel\Sanctum\PersonalAccessToken as SanctumPersonalAccessToken;
|
|
|
|
/**
|
|
* Расширение Sanctum PersonalAccessToken.
|
|
*
|
|
* Перехватывает Bearer-токены с префиксом «lpimp_» (машинные ключи
|
|
* impersonation-guard, G7-B) и возвращает null без обращения к БД.
|
|
* Это предотвращает crash при отсутствии таблицы personal_access_tokens
|
|
* (проект использует SPA cookie-auth, таблица не создаётся).
|
|
*/
|
|
class PersonalAccessToken extends SanctumPersonalAccessToken
|
|
{
|
|
/**
|
|
* Find the token instance matching the given token.
|
|
*
|
|
* Returns null immediately for impersonation machine-key tokens so
|
|
* Sanctum does not attempt a DB lookup on personal_access_tokens.
|
|
*/
|
|
public static function findToken($token): ?static
|
|
{
|
|
if (str_starts_with((string) $token, 'lpimp_')) {
|
|
return null;
|
|
}
|
|
|
|
// В проекте нет таблицы personal_access_tokens (SPA cookie-auth, Sanctum
|
|
// PAT не используются). Без этого try/catch любой иной Bearer на
|
|
// sanctum-роуте ронял бы запрос в 500 (Undefined table) вместо чистого
|
|
// 401. Гасим QueryException до null — guard вернёт 401.
|
|
try {
|
|
return parent::findToken($token);
|
|
} catch (QueryException) {
|
|
return null;
|
|
}
|
|
}
|
|
}
|