Symfony2, FOSuser: редактировать пользователя с пустым входным паролем

0

Я использую свою собственную сущность, которая расширяет fos_user.

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

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

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

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

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

SQLSTATE [23000]: Нарушение ограничения целостности: 1048 Колонка "пароль" не может быть нулевой

Вот как я объявляю ввод в моей форме $ builder:

->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
    Для Ether в базе данных и / или в Entity установлен пароль nullable = false, поэтому его нельзя обновить без установки пароля. Чтобы позволить то, что вы хотите, вы должны изменить это поведение, но я думаю, что это действительно большая дыра в безопасности
  • 1
    Я также не смог найти его в FOSUserBundle, но он установлен в базе данных, просто посмотрите в таблицу пользователей. Это единственный способ узнать, как это может работать без отправки пароля. Но вы действительно не должны этого делать, потому что довольно опасно разрешать пользователям не иметь пароля. На самом деле это недопустимо, данные от людей могут быть взломаны, просто войдя в систему, если пароль пуст
Показать ещё 2 комментария
Теги:
fosuserbundle
doctrine2

1 ответ

0
Лучший ответ

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

Можно установить Unhashed/Unsalted пароль с помощью 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
    Возможно, вам будет интересно это в будущем: github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/…
  • 0
    Да, это здорово, но, как мне объяснили. «Я расширяю сущность« Пользователь »на две отдельные таблицы (инвестор, который расширяет пользователя таблицы). Некоторые данные, такие как пароль и электронная почта, хранятся в пользователе. Инвестор может получить к ним доступ с помощью методов Fos_user». Поэтому, если я обновлю пользователя fos, мне все равно нужно будет сохранить данные моего инвестора, и я получу ту же ошибку. Но я уверен, что в других случаях менеджер пользователей - это то, что нужно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню