2

我正在使用 FosUserBundle 来处理我的应用程序登录/注册工作流程。然后我需要在注册时获取用户的纯密码,因为我想使用grant_type=password带有 FOSOAuthServer 包的工作流生成访问令牌。

我尝试了以下事件:

  • FOSUserEvents::REGISTRATION_INITIALIZE: 这里没有密码
  • FOSUserEvents::REGISTRATION_SUCCESS:普通密码但数据库中没有用户,因为此事件在用户创建之前被调用
  • FOSUserEvents::REGISTRATION_COMPLETED: 在数据库中创建了用户,但是$event->getUser()->getPlainPassword()返回 null,因为在创建用户时方法$userManager->updatePassword()plainPassword属性设置为 null

您对我该如何处理有任何安全的想法吗?我有主要想法,但我不确定这是否是正确的方法:

  • 将密码放入会话FOSUserEvents::REGISTRATION_SUCCESS并生成访问令牌,然后删除密码FOSUserEvents::REGISTRATION_COMPLETED
  • 覆盖用户管理器类以使该方法$userManager->updatePassword()不调用$userManager->eraseCredentials()并在注册时使用它(不知道怎么做)

干杯伙计们:)

4

1 回答 1

1

您可以在 FOSUserEvents::REGISTRATION_SUCCESS 事件中将 plainpassword 保存为用户模型上的新参数(例如 tempPlainPassword 参数),并随时使用它!

出于安全原因,您必须在使用后清空该参数(tempPlainPassword)的值;

namespace [someBundle]\UserBundle\EventListener;

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class RegistrationListener implements EventSubscriberInterface
{

    public static function getSubscribedEvents()
    {
    return array(
        FOSUserEvents::REGISTRATION_SUCCESS => 'onRegistrationSuccess',
    );
    }

    public function onRegistrationSuccess(FormEvent $event)
    {
            $user = $event->getForm()->getData();
           $user->setTempPlainPass($user->getPlainPassword());
    }
}
于 2013-11-24T09:09:03.673 回答