Middleware signed
Middleware signed проверяет наличие и корректность подписи в запросе. Он применяется к маршрутам, для которых генерируются подписанные URL с помощью методов signedRoute или temporarySignedRoute фасада URL. Если подпись отсутствует или недействительна, то будет выброшено исключение SymfonyComponentHttpKernelExceptionAccessDeniedHttpException или выполнен редирект на главную страницу в зависимости от способа обработки. В качестве параметров принимает имя маршрута, массив параметров и время жизни подписи для временных ссылок. Подпись генерируется на основе маршрута, параметров и секретного ключа приложения.
Синтаксис
@php
use IlluminateSupportFacadesURL;
$url = URL::signedRoute('route.name', ['param' => $value]);
$temporaryUrl = URL::temporarySignedRoute('route.name', now()->addMinutes(30), ['param' => $value]);
@endphp
Middleware применяется к маршруту в файле маршрутов:
<?php
use IlluminateSupportFacadesRoute;
Route::get('/user/{id}', function ($id) {
// ...
})->middleware('signed');
?>
Пример использования в маршруте
Давайте создадим маршрут, который будет доступен только по подписанному URL:
<?php
use IlluminateSupportFacadesRoute;
Route::get('/user/{id}', function ($id) {
return "User ID: " . $id;
})->middleware('signed')->name('user.show');
?>
Теперь сгенерируем подписанный URL в контроллере и отправим его пользователю:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesURL;
use AppModelsUser;
class UserController extends Controller
{
public function sendLink(User $user)
{
$url = URL::signedRoute('user.show', ['id' => $user->id]);
echo $url;
}
}
?>
Результат выполнения кода:
"http://localhost/user/1?signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Если перейти по этому URL без параметра signature или с изменённым параметром, то middleware вернёт ошибку.
Пример с временной подписью
Давайте создадим ссылку, действительную в течение 5 минут:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesURL;
class InviteController extends Controller
{
public function generate()
{
$url = URL::temporarySignedRoute(
'invite.accept',
now()->addMinutes(5),
['code' => 12345]
);
echo $url;
}
}
?>
Результат выполнения кода:
"http://localhost/invite/12345?expires=1234567890&signature=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
В маршруте обязательно нужно использовать middleware signed:
<?php
use IlluminateSupportFacadesRoute;
Route::get('/invite/{code}', function ($code) {
return "Invite code: " . $code;
})->middleware('signed')->name('invite.accept');
?>
Пример обработки ошибки в контроллере
Если вам нужно самостоятельно обрабатывать ошибку проверки подписи, можно использовать метод hasValidSignature в контроллере:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use AppModelsUser;
class UserController extends Controller
{
public function show(Request $request, $id)
{
if (! $request->hasValidSignature()) {
abort(401, 'Invalid signature.');
}
$user = User::findOrFail($id);
echo $user->name;
}
}
?>
Результат выполнения кода при неверной подписи:
"Invalid signature."
Смотрите также
-
метод
signedRoute,
который генерирует постоянную подпись для маршрута -
метод
temporarySignedRoute,
который создаёт подпись с ограничением по времени -
метод
hasSignedRoute,
который проверяет наличие подписи в текущем запросе -
метод
validate,
который позволяет валидировать входящие данные