РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
518 of 1392 menu

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,
    который позволяет валидировать входящие данные
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить