代码之家  ›  专栏  ›  技术社区  ›  treyBake user1850175

如何在控制器中使用约束

  •  0
  • treyBake user1850175  · 技术社区  · 7 年前

    我一直在尝试添加一个编辑用户页面,在这里他们可以更改用户名、电子邮件地址和密码。

    我试图实现的一件事是,他们必须输入旧密码才能将其更改为新密码。

    我一直在读这些网页:

    但在实现方面,我确实在努力。

    这是我的表单控制器:

    <?php
        namespace App\Controller\User;
    
        use App\Entity\User;
        use App\Form\User\EditUserType;
        use App\Repository\UserRepository;
        use Symfony\Bundle\FrameworkBundle\Controller\Controller;
        use Symfony\Component\HttpFoundation\Request;
        use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
    
        class EditController extends Controller
        {
            public function edit(Request $request, UserPasswordEncoderInterface $encoder)
            {
                $userInfo = ['username' => null, 'plainPassword' => null, 'password' => null, 'email' => null];
    
                $form = $this->createForm(EditUserType::class, $userInfo);
                $form->handleRequest($request);
    
                $user        = new User();
                $oldPassword = $user->getPassword();
    
                if ($form->isSubmitted() && $form->isValid()) {
                    $userInfo = $form->getData();
    
                    $username = $userInfo['username'];
                    $email    = $userInfo['email'];
                    $newPass  = $userInfo['plainPassword'];
                    $oldPass  = $userInfo['password'];
    
                    $encryptOldPass = $encoder->encodePassword($user, $oldPass);
    
                    if ($oldPassword === $encryptOldPass) {
                        $this->addFlash('danger', $oldPass. ' ' .$encryptOldPass. ' ' .$oldPassword);
                        return $this->redirectToRoute('user_edit');
                    } else {
                        $this->addFlash('success', $oldPassword. '-' .$encryptOldPass);
                        return $this->redirectToRoute('user_edit');
                    }
    
                    $pass = $encoder->encodePassword($user, $newPass);
    
                    $user->setPassword($pass);
                    $user->setEmail($email);
                    $user->setUsername($username);
    
                    echo 'trey was here';
    
                    $this->addFlash('success', 'User Details Edited');
    
                    return $this->redirectToRoute('user_edit');
                }
    
                return $this->render('user/edit.html.twig', array('form' => $form->createView()));
            }
        }
    

    我的EditUserType文件:

    <?php
        namespace App\Form\User;
    
        use Symfony\Component\Form\AbstractType;
        use Symfony\Component\Form\Extension\Core\Type\EmailType;
        use Symfony\Component\Form\Extension\Core\Type\PasswordType;
        use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
        use Symfony\Component\Form\Extension\Core\Type\TextType;
        use Symfony\Component\Form\FormBuilderInterface;
        use Symfony\Component\OptionsResolver\OptionsResolver;
    
        class EditUserType extends AbstractType
        {
            public function buildForm(FormBuilderInterface $builder, array $options)
            {
                $builder->add('email', EmailType::class)
                    ->add('username', TextType::class)
                    ->add('password', PasswordType::class, array())
                    ->add('plainPassword', RepeatedType::class, array(
                        'type' => PasswordType::class,
                        'first_options' => array('label' => 'New Password'),
                        'second_options' => array('label' => 'New Repeat Password')
                    ));
            }
    
            public function configureOptions(OptionsResolver $resolver)
            {
                $resolver->setDefaults(array());
            }
        }
    

    我的验证(文件:config/validator/validation.yaml)

    App\Form\User\EditUserType:
        properties:
            oldPassword:
                - Symfony\Component\Security\Core\Validator\Constraints\UserPassword:
                    message: 'Invalid Password'
    

    我的模板文件:

    {% include 'builder/header.html.twig' %}
    
    <div class="user-container" id="user-content">
        {% block body %}
            {% include 'builder/notices.html.twig' %}
    
            <div class="user-container">
                <i class="fas fa-user-edit fa-5x"></i>
            </div>
    
            <hr />
    
            {{ form_start(form) }}
                {{ form_row(form.username, { 'attr': {'class': 'form-control', 'value': app.user.username} }) }}
                {{ form_row(form.email, { 'attr': {'class': 'form-control', 'value': app.user.email} }) }}
                {{ form_row(form.password, { 'attr': {'class': 'form-control'} }) }}
                {{ form_row(form.plainPassword.first, { 'attr': {'class': 'form-control'} }) }}
                {{ form_row(form.plainPassword.second, { 'attr': {'class': 'form-control'} }) }}
    
                <div class="register-btn-container">
                    <button class="btn btn-danger" id="return-to-dash-btn" type="button">Cancel!</button>
                    <button class="btn btn-primary" type="submit">Update!</button>
                </div>
            {{ form_end(form) }}
        {% endblock %}
    </div>
    
    {% include 'builder/footer.html.twig' %}
    

    在旧密码字段中键入任何旧密码似乎都可以,而不会将密码更新为新键入的值。那么,如何根据数据库验证旧密码,以便用户将其更新为新密码呢?

    谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   treyBake user1850175    7 年前

    找到了解决方案,使用cerad对上一个(现在已删除)答案的注释:

    更新的控制器:

    <?php
        namespace App\Controller\User;
    
        use App\Form\User\EditUserType;
        use Symfony\Bundle\FrameworkBundle\Controller\Controller;
        use Symfony\Component\HttpFoundation\Request;
        use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
    
    
        class EditController extends Controller
        {
            public function edit(Request $request, UserPasswordEncoderInterface $encoder)
            {
                $userInfo = ['username' => null, 'plainPassword' => null, 'password' => null, 'email' => null];
    
                $form = $this->createForm(EditUserType::class, $userInfo);
                $form->handleRequest($request);
    
                $user = $this->getUser();
    
                $entityManager = $this->getDoctrine()->getManager();
    
                if ($form->isSubmitted() && $form->isValid()) {
                    $userInfo = $form->getData();
    
                    $username = $userInfo['username'];
                    $email    = $userInfo['email'];
                    $newPass  = $userInfo['plainPassword'];
                    $oldPass  = $userInfo['password'];
    
                    if (!$encoder->isPasswordValid($user, $oldPass)) {
                        $this->addFlash('danger', 'Old password is invalid. Please try again');
                        return $this->redirectToRoute('user_edit');
                    }
    
                    $pass = $encoder->encodePassword($user, $newPass);
    
                    $user->setPassword($pass);
                    $user->setEmail($email);
                    $user->setUsername($username);
    
                    $entityManager->persist($user);
                    $entityManager->flush();
    
                    $this->addFlash('success', 'User Details Edited - Please Login Again');
    
                    return $this->redirectToRoute('login');
                }
    
                return $this->render('user/edit.html.twig', array('form' => $form->createView()));
            }
        }
    

    问题是,我没有检查登录用户的详细信息,我认为persist意味着插入,而不是插入/更新——所以对这一点缺乏了解。