#symfony #oauth #listener #http-redirect
#symfony #oauth #прослушиватель #http-перенаправление
Вопрос:
Я хотел бы выполнить перенаправление перед вызовом любого прослушивателя.
В частности, перед запуском oauthListener hwi.
Причина, по которой я хочу это сделать:
- Я внедряю oauth в моей платформе symfony plateform / app
- Мое приложение управляет несколькими «блогами» (многосайтовый стиль WordPress)
- Я хочу, чтобы oauth (facebook, Google …) использовал одно приложение и не приходилось настраивать одно приложение каждый раз при создании нового «блога»
- Возникшие проблемы:
- URL перенаправления должен быть уникальным (даже если для Google вы можете задать несколько, я не хочу)
- мои блоги иногда имеют псевдонимы => не всегда просматриваются в одном домене
- проблемы с моими сеансами, поскольку они не могут быть разделены между несколькими доменами (sub yes, domains no)
- Решение, которое я уже внедрил:
- в моем запросе oauth я передаю общий домен для redirect_uri
- Я использую параметр запроса состояния для хранения домена, из которого я был создан
- Чего я хочу:
- я хочу иметь ядро прослушивателя или другое, которое появляется раньше всего остального, чтобы проверить, установлен ли у меня этот параметр запроса состояния
- Я хочу, чтобы это вызвало немедленное перенаправление текущего запроса на исходный домен, который я сохранил в параметре «state».
Я делаю это совершенно неправильно?
Если я хочу продолжить, знаете ли вы, как я должен объявить свой прослушиватель, чтобы он был первым И имел возможность запускать немедленное перенаправление?
Ответ №1:
kernel.request
Событие является первым отправляемым событием.
Взгляните на список событий ядра.
Чтобы ваш конкретный прослушиватель выполнялся раньше других kernel.request
прослушивателей, вы можете добавить priority
параметр (диапазон: от -255 до 255, самый высокий выполняется первым) в конфигурацию службы вашего прослушивателя.
пример:
services:
kernel.listener.your_listener_name:
class: AcmeDemoBundleEventListenerAcmeRequestListener
tags:
- name: kernel.event_listener
event: kernel.request
method: onKernelRequest
priority: 255
Теперь все, что вам осталось, это выполнить перенаправление при определенных условиях внутри onKernelRequest()
метода прослушивателя.
Я уверен, вы поймете, как это сделать. Полный пример кода выходит за рамки этого вопроса.
Дополнительные инструкции по написанию прослушивателя событий ядра можно найти в главе документация:
Ответ №2:
Действительно, это было оно.
Я пробовал это несколько раз и думал, что это не сработало, но, вероятно, это была проблема очистки кэша.
Итак, для тех, кто хотел бы знать: я обрабатываю свои данные, чтобы создать перенаправляющий ответ (SymfonyComponentHttpFoundationRedirectResponse)
и в onKernelRequest я делаю
public function onKernelRequest(GetResponseEvent $event){
/**
... do stuff here
*/
$event->setResponse($myResponse);
}