Symfony 4.2 не может выйти

Я хочу реализовать действие выхода из системы на моем Symfony проект.

В настоящий момент, когда я делаю выход из системы, я получаю исключение

controller can be blank: it will never be executed!. 

Я покопался в Интернете и в документации Symfony, обычно этот контроллер конечной точки никогда не достигается.

В моем контексте я не могу выйти из системы и не знаю, почему выполняется эта функция выхода.

это моя конфигурация SecurityController.hp

 /**
 * @Route("/logout", name="app_logout", methods={"GET"})
 */
public function logout()
{
    // controller can be blank: it will never be executed!
    throw new \Exception('controller can be blank: it will never be executed!');
}

security.yaml

    firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false

    main:
        anonymous: ~
        pattern:  /login
        provider: app_user_provider
        guard:
            authenticators:
                - App\Security\LoginFormAuthenticator
        logout:
            path: app_logout
            # where to redirect after logout
            target: app_login

Хорошего дня!

4 ответа

Вы поместили прослушиватель выхода из системы в «основной» брандмауэр, но URL-адрес выхода не покрывается шаблоном. Таким образом, запрос «/logout» не будет проходить через него. Вы можете поместить прослушиватель выхода из системы в этот брандмауэр, который покрывает URL-адрес выхода, или изменить шаблон «основного» брандмауэра, включив в него URL-адрес выхода. Последний выглядит так:

      # config/packages/security.yaml
firewalls:
  main:
    # ...
    pattern: ^/(login|logout)$
    # ...

Ваша функция может быть пустой, попробуйте удалить метод get

код выглядит правильно

Прочтите документацию.

Чтобы разрешить выход, активируйте параметр конфигурации выхода из системы под вашим брандмауэром.

# config/packages/security.yaml
firewalls:
  main:
    # ...

    logout:
      path:   app_logout
      # where to redirect after logout
      # target: app_any_route

Затем вам нужно будет создать маршрут для этого URL (но не для контроллера).

# config/routes.yaml
app_logout:
  path: /logout
  methods: GET

Решение 1

Если вы следуете инструкциям в Symfony Security, выход из системы

<?php

//App/Controller/SecurityController.php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

  class SecurityController extends AbstractController{
/**
 * @Route("/logout", name="app_logout")
 */
public function logout()
 {
    throw new \Exception('This method can be blank - it will be intercepted by the logout key on your firewall');
  }
}

Решение 2

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

class LogoutListener implements LogoutHandlerInterface{

/**
 * @{inheritDoc}
 */
public function logout(Request $request, Response $response, TokenInterface $token)
{
   // do whatever you want
    $user = $token->getUser();
  }
}

и добавьте его в брандмауэрhandlers: App/listener/LogoutListener

Другие вопросы по тегам