在使用AuthenticationHandlers时,我看到Symfony支持EventSubscribers,在使用多种方法进行身份验证时可以更灵活。
我一直以此为例:https://knpuniversity.com/screencast/guard/success-handling
所以我的订阅者类都设置好了,但是我不知道该怎么做才能将注册视为Silex中的一个事件。
我很确定我需要使用$app['dispatcher']
,但我不知道要听的是什么事件。使用页面中的示例,在Symfony配置中,servics标记为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有资格作为交互式登录,所以我不确定为什么没有调用该方法。
答案 0 :(得分:2)
您的订阅者类应实现EventSubscriberInterface
。如果是,请使用addSubscriber
方法代替addListener
。
$app['dispatcher']->addSubscriber(new MyEventSubscriber());
您的事件订阅者有一个名为getSubscribedEvents
的方法,它告诉Symfony要订阅哪些事件,因此您根本不需要传递事件名称。有关详细信息,请参阅the Symfony docs。
更新(安全监听器):
基本HTTP身份验证方法不被视为交互式登录。这是一个典型的基于Web的登录表单。
您可以使用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');
}
}