2015-02-19 6 views
0

Я использую свою собственную сущность, расширяющую fos_user.Symfony2, FOSuser: Редактировать пользователя с пустым паролем ввода

Я расширяю объект User фактически в 2 разных таблицах (инвестор, который расширяет пользователя таблицы). Некоторые данные, такие как пароль и электронная почта, хранятся у пользователя. Инвестор может получить доступ к этим методам Fos_user.

У меня есть форму, заполненную данными пользователей. Мне нужно обновить пользователя с помощью пароля или без него.

Вот как это делается:

if(!empty($form->get('password')->getData())){ 
    $investor->setPlainPassword($form->get('password')->getData()); 
} 

Обновление отлично работает, за исключением, если входной пароль пуст.

SQLSTATE [23000]: Integrity нарушение ограничения: 1048 Column 'пароль' не может быть пустым

Это, как я объявляю ввод в моей форме $ застройщиком:

->add('password', 'repeated', 
      array(
       'type' => 'password', 
       'invalid_message' => 'The password fields have to be the same', 
       'required' => false, 
       'first_options' => array('label' => 'New password'), 
       'second_options' => array('label' => 'Confirm the new password') 
      ) 
     ) 

И это мой контроллер:

public function updateInvestorAction(Request $request) 
{ 
    $user = $this->container->get('security.context')->getToken()->getUser(); 

    $investor = $this->getDoctrine()->getRepository('AppBundle:Investor')->findOneBy(array('id' => $user->getId())); 

    $form = $this->createForm(new UpdateInvestorType(), $investor); 

    $form->handleRequest($request); 

    if ($form->isValid()) { 

     if(!empty($form->get('password')->getData())){ 
      $investor->setPlainPassword($form->get('password')->getData()); 
     } 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($investor); 
     $em->flush(); 

     $session = $this->getRequest()->getSession(); 
     $session->getFlashBag()->add('message', 'Votre profil a été correctement modifié'); 

     return $this->redirect($this->generateUrl('home')); 

    } 

    return array(
     'form' => $form->createView(), 
    ); 
} 

Как я могу обновить пользователя, не давая новый или предыдущий пароль?

+0

Эфира в базе данных и/или в Entity пароль установлен в NULLABLE = ложь, то почему вы не можете обновить его без установки пароля. Чтобы разрешить то, что вы хотите, вы должны изменить это поведение, но я думаю, что это реальное большое отверстие безопасности ** – KhorneHoly

+1

Я тоже не мог найти его в FOSUserBundle, но он установлен в базе данных, просто следите за ним в вашей пользовательской таблице. Это единственный способ узнать, как он может работать, не отправляя пароль. Но вы действительно не должны этого делать, потому что довольно опасно, чтобы пользователи не имели пароля. На самом деле это неприемлемо, данные от людей могут быть захвачены просто путем входа в систему, если пароль равен нулю – KhorneHoly

+0

Но у FOS User Bundle есть функция редактирования пользователя. Возможно, вы можете посмотреть, как они это делают, и адаптировать его к вашему коду! – KhorneHoly

ответ

0

я, наконец, нашел решение:

Это можно установить Unhashed/несоленого пароль с SetPassword();

Для этого, если пароль пуст, я установлю пароль с предыдущим хешированным паролем, чтобы он не был снова хэширован. Если он не пуст, я буду использовать метод setPlainPassword().

Здесь новый контроллер:

public function updateInvestorAction(Request $request) 
{ 
    $user = $this->container->get('security.context')->getToken()->getUser(); 

    $investor = $this->getDoctrine()->getRepository('AppBundle:Investor')->findOneBy(array('id' => $user->getId())); 

    $password = $investor->getPassword(); 

    $form = $this->createForm(new UpdateInvestorType(), $investor); 

    $form->handleRequest($request); 

    if ($form->isValid()) { 

     if(!empty($form->get('password')->getData())){ 
      $investor->setPlainPassword($form->get('password')->getData()); 
     } 
     else{ 
      $investor->setPassword($password); 
     } 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($investor); 
     $em->flush(); 

     $session = $this->getRequest()->getSession(); 
     $session->getFlashBag()->add('message', 'Votre profil a été correctement modifié'); 

     return $this->redirect($this->generateUrl('home')); 

    } 

    return array(
     'form' => $form->createView(), 
    ); 
} 
+1

Возможно, вас это заинтересует в будущем: https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/user_manager.md –

+0

Да, это здорово, но, как мне объяснили. «Я расширяю объект User фактически в 2 разных таблицах (инвестор, расширяющий пользователя таблицы). Некоторые данные, такие как пароль и электронная почта, хранятся в пользователе. Инвестор может получить доступ к этим методам Fos_user». Поэтому, если я обновляю fos-пользователя, мне все равно нужно сохранять данные своего инвестора, и я получу ту же ошибку.Но я уверен, что пользовательский менеджер - это способ пойти в других случаях. – Brieuc

Смежные вопросы