Можно ли использовать EventSubscribeers с Silex?
Взглянув на использование AuthenticationHandlers, я обнаружил, что Symfony поддерживает EventSubscribeers, который может быть более гибким при аутентификации несколькими методами.
Я использовал это в качестве примера: https://knpuniversity.com/screencast/guard/success-handling
Итак, у меня все настройки класса подписчика, но я не знаю, как это сделать, - это зарегистрироваться как событие в Silex.
Я уверен, что мне нужно использовать $app['dispatcher']
но что я не знаю, это то, что событие слушать. Используя пример со страницы, в конфигурации Symfony сервисы помечены как kernel.event_subscriber
но когда я сделал следующее в Silex, ничего не произошло:
$app['dispatcher'] -> addListener(KernelEvents::EVENT_SUBSCRIBER, function(Event $event) use ($app) {
... do something ...
});
Я почти уверен, что событие, которое я слушаю, неверно, но я также не получил никаких ошибок. Это возможно в Silex?
спасибо рассел
Обновить:
Это мой класс подписчика:
<?php
namespace MySubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Http\SecurityEvents;
class ApiKeySubscriber implements EventSubscriberInterface {
public function onInteractiveLogin(InteractiveLoginEvent $event) {
file_put_contents("/tmp/onInteractiveLogin.txt", "It was ehere");
}
public static function getSubscribedEvents() {
return array(SecurityEvents::INTERACTIVE_LOGIN => 'onInteractiveLogin');
}
}
Брандмауэр очень прост:
// Configure the firewalls for the application
$app['security.firewalls'] = array(
'basicauth' => array(
'pattern' => '^/auth',
'http' => true,
'users' => $app -> share(function() use ($app) {
return new UserAccount($app);
})
)
);
И тогда я добавляю подписчика с помощью:
$app['dispatcher'] -> addSubscriber(new \MySubscriber\ApiKeySubscriber());
Я предполагаю, что Basic Auth квалифицируется как интерактивный вход в систему, поэтому я не уверен, почему метод не вызывается.
1 ответ
Ваш класс подписчика должен реализовать EventSubscriberInterface
, Если это так, просто используйте addSubscriber
метод вместо addListener
,
$app['dispatcher']->addSubscriber(new MyEventSubscriber());
У вашего подписчика на событие есть метод getSubscribedEvents
он сообщает Symfony, на какие события подписаться, так что вам вообще не нужно передавать имя события. Посмотрите документы Symfony для получения дополнительной информации.
Обновление (прослушиватель безопасности):
Основной метод HTTP-аутентификации не считается интерактивным входом в систему. Это для типичной формы входа в сеть.
Вы можете быть в состоянии использовать AuthenticationEvents::AUTHENTICATION_SUCCESS
вместо. Ваш метод слушателя получит AuthenticationEvent
пример.
<?php
namespace MySubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\AuthenticationEvents;
use Symfony\Component\Security\Core\Event\AuthenticationEvent;
class ApiKeySubscriber implements EventSubscriberInterface
{
public function onAuthenticate(AuthenticationEvent $event)
{
file_put_contents("/tmp/onInteractiveLogin.txt", "It was here");
}
public static function getSubscribedEvents()
{
return array(AuthenticationEvents::AUTHENTICATION_SUCCESS => 'onAuthenticate');
}
}