我正在使用FosUser重置密码系统,我不知道如何在用户更改密码后删除自动登录?
感谢您的帮助,我不想覆盖,我直接更改FOS文件。
答案 0 :(得分:5)
正确的方式:)
Symfony中的编译器通行证允许您操纵其他服务。在这种情况下,您希望覆盖fos_user.listener.authentication
以使用自定义订阅者而不是FOSUserBundle FOS\UserBundle\EventListener\AuthenticationListener
提供的订阅者。您可以扩展提供的只能注册注册事件而不是重置密码事件:
<?php
// src/YourCompany/YourBundle/EventListener/AuthenticationListener.php
namespace YourCompany\YourBundle\EventListener;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\EventListener\AuthenticationListener as FOSAuthenticationListener;
class AuthenticationListener extends FOSAuthenticationListener
{
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::REGISTRATION_COMPLETED => 'authenticate',
FOSUserEvents::REGISTRATION_CONFIRMED => 'authenticate'
);
}
}
为此,只需定义一个编译器通行证:
<?php
// src/YourCompany/YourBundle/DependencyInjection/Compiler/FOSUserOverridePass.php
namespace YourCompany\YourBundle\DependencyInjection\Compiler;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class FOSUserOverridePass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$container->getDefinition('fos_user.listener.authentication')->setClass('YourCompany\YourBundle\EventListener\AuthenticationListener');
}
}
然后在捆绑包定义中注册编译器传递:
<?php
// src/YourCompany/YourBundle/YourCompanyYourBundle.php
namespace YourCompany\YourBundle;
use YourCompany\YourBundle\Compiler\FOSUserOverridePass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class YourCompanyYourBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new FOSUserOverridePass());
}
}
那就是它!
这里有一些要阅读的内容:http://symfony.com/doc/current/cookbook/service_container/compiler_passes.html
您要覆盖的服务:https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/config/listeners.xml
答案 1 :(得分:1)
如果要覆盖捆绑包,则必须在\ vendor \ friendsofsymfony \ user-bundle \ FOS \ UserBundle \ Controller \ ResettingController.php中注释第132行:
$dispatcher->dispatch(FOSUserEvents::RESETTING_RESET_COMPLETED, new FilterUserResponseEvent($user, $request, $response));
禁用自动登录。但正如巴蒂克所说,这不是一个好方法。 虽然它只适用于一行...... 我希望它会对你有所帮助,因为我担心,我在注册过程中通过重载文件在同一行注释:
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));
注册后禁用自动登录。
答案 2 :(得分:1)
最后我觉得我发现了一个轻松而干净的方法:事件可以停止! 在停止事件流/传播处查看http://symfony.com/doc/current/components/event_dispatcher/introduction.html。 注册后登录的事件似乎是REGISTRATION_COMPLETED,因此请以高优先级为该事件订阅
...
public static function getSubscribedEvents() {
return array(
FOSUserEvents::REGISTRATION_COMPLETED => ['onRegistrationCompleted',9999],
);
}
public function onRegistrationCompleted(FilterUserResponseEvent $event) {
// this trick prevent login now
$event->stopPropagation();
}
然后,如果您担心某些重要的听众/订阅者失去了该事件,请调整听取优先级......
答案 3 :(得分:0)
我也使用了@David建议的类似解决方案。我的要求是只有Admin才能创建用户,如果用户成功创建了它,则应该重定向到用户页面列表。
我所做的是我处理了两个/三个事件。第一个是REGISTRATION_SUCCESS,我将自定义重定向网址附加到事件中,如下所示(文档中也提到):
public static function getSubscribedEvents()
{
return [
FOSUserEvents::REGISTRATION_SUCCESS => [
['onRegistrationSuccess', -10],
],
];
}
public function onRegistrationSuccess(FormEvent $event) {
$url = $this->router->generate('list_all_users');
$event->setResponse(new RedirectResponse($url));
}
如果您在成功后查看FOSUserbundle RegistrationController的代码,则另外两个事件已发送到REGISTRATION_CONFIRM / ED。所以我处理了这些事件并阻止了它们:
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::REGISTRATION_COMPLETED => ['stopEvent', 9999],
FOSUserEvents::REGISTRATION_CONFIRMED => ['stopEvent', 9999],
);;
}
public function stopEvent(FilterUserResponseEvent $event) {
$event->stopPropagation();
}
希望这可以帮助某人。