Я использую свою собственную сущность, расширяющую 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(),
);
}
Как я могу обновить пользователя, не давая новый или предыдущий пароль?
Эфира в базе данных и/или в Entity пароль установлен в NULLABLE = ложь, то почему вы не можете обновить его без установки пароля. Чтобы разрешить то, что вы хотите, вы должны изменить это поведение, но я думаю, что это реальное большое отверстие безопасности ** – KhorneHoly
Я тоже не мог найти его в FOSUserBundle, но он установлен в базе данных, просто следите за ним в вашей пользовательской таблице. Это единственный способ узнать, как он может работать, не отправляя пароль. Но вы действительно не должны этого делать, потому что довольно опасно, чтобы пользователи не имели пароля. На самом деле это неприемлемо, данные от людей могут быть захвачены просто путем входа в систему, если пароль равен нулю – KhorneHoly
Но у FOS User Bundle есть функция редактирования пользователя. Возможно, вы можете посмотреть, как они это делают, и адаптировать его к вашему коду! – KhorneHoly