2013-07-08 120 views
1

我正在使用FosUserBundle來處理我的應用程序登錄/註冊工作流程。然後,我需要在註冊時獲取用戶的密碼,因爲我想通過使用帶有FOSOAuthServer軟件包的grant_type=password工作流來生成訪問令牌。使用FOSUser包註冊時獲取用戶的明碼密碼

  • FOSUserEvents::REGISTRATION_INITIALIZE:無密碼這裏
  • FOSUserEvents::REGISTRATION_SUCCESS

    我用下面的事件試圖平原密碼,但在數據庫中沒有用戶,因爲該事件是用戶創建

  • FOSUserEvents::REGISTRATION_COMPLETED前右又叫:用戶是在數據庫中創建的,但$event->getUser()->getPlainPassword()返回null,因爲在創建用戶時,方法$userManager->updatePassword()plainPassword屬性設置爲空

你有什麼安全的想法,我該如何處理?我有主的想法,但我不知道這是否是做的正確方法:

  • 放入會話密碼上FOSUserEvents::REGISTRATION_SUCCESS並生成訪問令牌然後刪除密碼FOSUserEvents::REGISTRATION_COMPLETED
  • 覆蓋用戶管理器類,使$userManager->updatePassword()做沒有呼叫$userManager->eraseCredentials()的方法和使用它的註冊(不surehow做)

乾杯傢伙:)

回答

0

可以節省plainpa ssword作爲事件FOSUserEvents :: REGISTRATION_SUCCESS中的用戶模型的新參數(例如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()); 
    } 
}