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