Symfony2,FOSUser,重置密码后不登录用户

时间:2014-05-30 14:20:49

标签: symfony fosuserbundle

我正在使用FosUser重置密码系统,我不知道如何在用户更改密码后删除自动登录?

感谢您的帮助,我不想覆盖,我直接更改FOS文件。

4 个答案:

答案 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

原来的课程:https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/EventListener/AuthenticationListener.php

答案 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();
}

希望这可以帮助某人。