Новое в Symfony 6.4: Упрощённый выход из системы
В приложениях Symfony функция выхода из системы безопасности включается и настраивается для каждого файрвола. Вы можете настроить его с помощью YAML, XML или PHP, но в следующем примере показана только конфигурация YAML:
# config/packages/security.yaml
security:
# ...
firewalls:
main:
# ...
logout:
path: app_logout
Ключом данной конфигурации является опция path
, определяющая маршрут/URL, по которому пользователь должен пройти, чтобы отменить аутентификацию в приложении. Symfony полностью обрабатывает данный процесс выхода из приложения, но этот маршрут/URL должен существовать в вашем приложении.
Поэтому необходимо добавить этот маршрут в приложение. Например, можно создать такое YAML-определение маршрута, которое не указывает ни на один экшен контроллера:
# config/routes.yaml
app_logout:
path: /logout
methods: GET
Или, если вы предпочитаете определять все маршруты в PHP классах через атрибуты, можно поступить следующим образом:
// src/Controller/SecurityController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
class SecurityController extends AbstractController
{
#[Route('/logout', name: 'app_logout', methods: ['GET'])]
public function logout(): never
{
// контроллер может быть пустым: он никогда не будет вызван!
throw new \Exception('Don\'t forget to activate logout in security.yaml');
}
}
Создание этого маршрута всегда казалось немного странным. Если Symfony обрабатывает всю логику выхода из системы, то почему бы не позаботиться и об этом маршруте? В Symfony 6.4 мы упрощаем функцию выхода из системы, чтобы позаботиться об этом.
Технически это работает благодаря пользовательскому загрузчику маршрутов, создающему для вас маршруты выхода из системы. Если ваше приложение использует Symfony Flex, то необходимая конфигурация будет добавлена в приложение автоматически при обновлении рецепта symfony/security-bundle
. В противном случае вам потребуется добавить эту конфигурацию в ваше приложение:
_security_logout:
resource: security.route_loader.logout
type: service