Можно ли использовать 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');
  }
}
Другие вопросы по тегам