Методы авторизации и валидации контроллеров в Laravel 11

Источник: «Security Tip: Laravel 11's Controller Authorisation & Validation Methods»
В рамках упрощения структуры приложений в Laravel 11 методы Request Authorization и Validation больше не доступны в контроллере — вот как их вернуть.

Следующим в серии статей о функциях безопасности в Laravel 11 будет упрощение базового класса Controller, который больше не включает по умолчанию трейт AuthorizesRequests и ValidatesRequests.

Согласно примечаниям к релизу:

Базовый контроллер, включаемый в новые приложения Laravel, был упрощён. Он больше не расширяет внутренний класс Laravel Controller, а трейт AuthorizesRequests и ValidatesRequests был удалён, поскольку при желании их можно самостоятельно добавить в контроллеры приложения:

<?php

namespace App\Http\Controllers;

abstract class Controller
{
//
}

Это означает, что больше нельзя использовать следующие хелперы в контроллерах без предварительного включения связанных с ними трейтов (В этих трейтах есть и другие хелперы, но это самые часто используемые.):

// ValidatesRequests
$this->validate();

// AuthorizesRequests
$this->authorize();
$this->authorizeResource();

Если вы, как и я, всегда передаёте Illuminate\Http\Request в экшен контроллера и выполняете $request->validate() на нем, и помещаете всю свою авторизацию в маршруты, то могли не заметить этого изменения.

Однако, если вы используете один из этих методов, вам наверняка захочется вернуть их обратно при запуске нового проекта. Особенно если вы поместили авторизацию внутрь контроллеров, что многие и делают!

Всё, что усложняет доступ к авторизации, увеличивает уязвимости отсутствующей авторизации, хотя я заметил, что документация теперь рекомендует использовать фасад Gate вместо этого хелпера, так что это может быть хорошим решением.

Но если они всё-таки понадобятся, как их вернуть?

Всё просто: откройте файл app/Http/Controllers/Controller.php и добавьте в него трейты:

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Validation\ValidatesRequests;

abstract class Controller
{
use AuthorizesRequests;
use ValidatesRequests;
}

Вот, собственно, и всё 🙂.

В конечном итоге это простое изменение с тривиальным исправлением. Но я посчитал, что его стоит отметить в рамках серии статей об обновлениях безопасности в Laravel 11, на случай если вы полагаетесь на эти методы и обнаружите их отсутствие при создании новых проектов.

Дополнительные материалы

Предыдущая Статья

PHP 8.4: OpenSSL: минимальная требуемая версия увеличена до 1.1.1

Следующая Статья

Laravel фасады vs псевдонимы классов