gpt4 book ai didi

php - Symfony2 密码重置而不覆盖 FOSUser

转载 作者:可可西里 更新时间:2023-11-01 12:18:18 25 4
gpt4 key购买 nike

我正在尝试构建一个重置用户密码的表单。我正在使用 FOSUserBundle 来管理用户,但由于某些架构原因,我不想覆盖 FOSUser 重置 Controller

所以我决定构建自己的类型和 Controller 来重置密码

密码重置类型.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('plainPassword', RepeatedType::class, array(
'type' => PasswordType::class,
'attr' => ['class' => 'form-group has-feedback'],
'first_options' => array('label' => false,
'attr' => ['placeholder' => 'New Password']
),
'second_options' => array('label' => false,
'attr' => ['placeholder' => 'Repeat Password']),
'invalid_message' => 'Passwords don't match',
));
}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'CoreBundle\Entity\User',
'csrf_token_id' => 'resetting'
));
}

重置 Controller

/**
* @Route("/reset/{token}", name="api_resetting_reset")
*/
public function resetAction(Request $request, $token)
{
$userManager = $this->get('fos_user.user_manager');

$user = $userManager->findUserByConfirmationToken($token);

if (null === $user) {
return $this->render('APIBundle:Resetting:error.html.twig');
}

$form = $this->createForm(PasswordResettingType::class, $user);

$form->handleRequest($request);

if ($form->isValid()) {
$user->setConfirmationToken(null);
$user->setPasswordRequestedAt(null);
$user->setPlainPassword($form["plainPassword"]->getData());
$userManager->updateUser($user);

return $this->redirectToRoute('api_resetting_success');
}

return $this->render('APIBundle:Resetting:reset.html.twig', array(
'token' => $token,
'form' => $form->createView()
));
}

重置.html. Twig

{{ form_start(form) }}

{% for passwordField in form.plainPassword %}
<div class="form-group has-feedback">
{{ form_widget(passwordField, { 'attr': {'class': 'form-control'} }) }}
<span class="show">show</span>
{{ form_errors(passwordField) }}
</div>
{% endfor %}

<input type="submit" class="btn" value="Submit" />
{{ form_end(form) }}

但是当我提交表单时,没有设置新密码,ConfirmationToken 和 PasswordRequestedAt 也没有设置为空。

最佳答案

我认为你做错了。如果您查看 FOS User 并详细阅读文档,您将看到他们使用 EventListeners 来执行此操作。 .

这意味着您可以挂上它们并做您的事情。或者,如果你不想这样做,你可以覆盖它并制作你自己的。像你这样半途而废是不会正常工作的。例如,您没有检查检查密码请求是否过期的 onResettingResetInitialize 事件。

关于最后一个答案,我认为你真的不需要这样做:

$encoder = $this->container->get('security.password_encoder');
$user->setPassword($encoder->encodePassword($user, $user->getPlainPassword()));

因为这是 UserManager->UpdateUser() 的工作

顺便说一下:你不能从那里调试并放置一个转储($user);exit();并检查输出是什么以及是否被正确调用。

另外 Boulzy 的评论是对的:/reset/{token} 与 FOS 的路由相同。如果您使用 echo debug_backtrace() 调试 UpdateUser;您还可以从调用 UpdateUser 的位置看到。

关于php - Symfony2 密码重置而不覆盖 FOSUser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40046363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com