如何在Symfony 5中对密码进行编码?

2ledvvac  于 2022-11-16  发布在  其他
关注(0)|答案(5)|浏览(150)

我试图在Symfony中编码一个密码,在仔细遵循这里的文档之后,似乎我仍然做错了什么。
这是我的注册控制器.php:

<?php
    namespace App\Controller;

    use App\Entity\User;
    use App\Form\Type\UserType;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Routing\Annotation\Route;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class RegisterController extends AbstractController
{
private $passwordEncoder;

public function __construct(UserPasswordEncoderInterface $passwordEncoder)
{
    $this->passwordEncoder = $passwordEncoder;        
}

/**
    * @Route("/register", name="user.register")
    */
public function create(Request $request)
{
    $user = new User();

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

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        $user->setPassword( 
            $this->passwordEncoder->encodePassword( $user, $user->getPassword() )
        );

以上返回以下错误:
属性“plainPassword”和方法“getPlainPassword()"、“plainPassword()"、“isPlainPassword()"、“hasPlainPassword()"、”__get()”中的任何一个都不存在,并且在类“应用\实体\用户”中不具有公共访问权限。
下面是我的Register.twig.html:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Register{% endblock %}</title>
        {# {% block stylesheets %}{% endblock %} #}
    </head>
    <body>
        <div class="container">
            <h2 class="form-signin-heading">Welcome, please register below</h2>
            {{ form(form) }}
        </div>

    </body>
</html>

最后,我在security.yaml文件中有这样的设置:

security:    
   encoders:
        App\Entity\User:
            algorithm: auto

我想这是我忽略的一些简单的东西,但我不能让它工作。这是我第一次使用Symfony

rdlzhqv9

rdlzhqv91#

实际上,这是因为symfony检测到用户实体中是否没有“plainPassword”属性。使用此“plainPassword”属性的目的是作为临时数据,因此我们可以对其进行编码。您需要做的是在表单类型中将“plainPassword”属性Map为false

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('plainPassword', RepeatedType::class, array(
            'type'              => PasswordType::class,
            'mapped'            => false,
            'first_options'     => array('label' => 'New password'),
            'second_options'    => array('label' => 'Confirm new password'),
            'invalid_message' => 'The password fields must match.',
        ))
    ;
}

并在你的控制器中将“plainPassword”编码为“password”编码:

/**
 * @Route("/register", name="app_register")
 */
public function register(Request $request, UserPasswordEncoderInterface $passwordEncoder): Response
{
    $user = new User();
    $form = $this->createForm(RegistrationFormType::class, $user);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        // encode the plain password
        $user->setPassword(
            $passwordEncoder->encodePassword(
                $user,
                $form->get('plainPassword')->getData()
            )
        );

        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($user);
        $entityManager->flush();

        // do anything else you need here, like send an email

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

    return $this->render('registration/register.html.twig', [
        'form' => $form->createView(),
    ]);
}
u0njafvf

u0njafvf2#

问题出在别处。
如果你调用的“plainPassword”方法不存在,在你的分支或表单中检查,并用“password”替换它。

n9vozmp4

n9vozmp43#

这个错误似乎是在twig文件中。您尝试显示$plainPassword成员,但它很可能没有在实体上定义(在我开始symfony的路上,经常发生这个错误)。尝试删除它,然后检查错误。
至于密码的编码,请看这个网址,因为它解释了密码是如何在security.yml文件中加密的。你需要定义将要编码的类,算法可以更改为自定义的,你可以构建,为此,请检查this URL
编码没有那么复杂,但错误与编码无关,所以请尝试这个并更新帖子。

vcirk6k6

vcirk6k64#

所以,我发现了这个错误,唉!我在UserType.php中设置了plainPassword字段:

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
        ->add('firstname', TextType::class)
        ->add('lastname', TextType::class)
        ->add('email', EmailType::class)
        ->add('birthdate', DateType::class)
        ->add('plainPassword', RepeatedType::class, array(
            'type' => PasswordType::class,
            'first_options'  => array('label' => 'Password'),
            'second_options' => array('label' => 'Repeat Password'),
        ))
        ->add('save', SubmitType::class, ['label' => 'Register']);
    }
...

将其更改为password(就像我在User实体中所做的那样)可以更正错误。
谢谢大家的帮助。

p3rjfoxz

p3rjfoxz5#

自Symfony 5.3起,UserPasswordEncoderInterface已被弃用,取而代之的是UserPasswordHasherInterface。有关详细信息,请参阅本文。Symfony 6 fixtures UserPasswordHasherInterface

相关问题