Как кодировать пароль при создании пользователя с помощью Sonata Admin (Symfony 4)? - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь закодировать поле plainPassword с помощью Sonata Admin при создании пользователя.Я не использую FOSUserBundle, как в этом выпуске .Вот мой UserAdmin класс:

<?php
// src/Admin/UserAdmin.php
namespace App\Admin;

use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Sonata\AdminBundle\Form\Type\ModelType;
use App\Entity\Image;

class UserAdmin extends AbstractAdmin
{
    protected function configureFormFields(FormMapper $formMapper) {
        $formMapper
            ->add('username', TextType::class)
            ->add('email', EmailType::class)
            ->add('plainPassword', TextType::class)
            ->add('avatar', ModelType::class, [
                'class' => Image::class,
                'property' => 'image',
            ])
        ;
    }

    protected function configureDatagridFilters(DatagridMapper $datagridMapper) {
        $datagridMapper->add('username')
            ->add('avatar', null, [], EntityType::class, [
                'class'    => Image::class,
                'choice_label' => 'image',
            ])
        ;
    }

    protected function configureListFields(ListMapper $listMapper) {
        $listMapper
            ->addIdentifier('username')
        ;
    }

И мой services.yaml содержит следующее:

admin.user:
        class: App\Admin\UserAdmin
        arguments: [~, App\Entity\User, ~]
        tags:
            - { name: sonata.admin, manager_type: orm, label: User }
        public: true

Я не знаю, должен ли я переопределить preUpdate метод, подобныйв этом примере и prePersist метод или нет.

Мой security.yaml начинается так:

security:
    encoders:
        App\Entity\User:
            algorithm: bcrypt
    # https://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
    providers:
        #in_memory: { memory: ~ }
        my_db_provider:
            entity:
                class: App\Entity\User

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Я нашел решение: написать код в методе prePersist.Мой метод configureFormFields немного изменился, но без последствий:

protected function configureFormFields(FormMapper $formMapper) {
    $formMapper
        ->add('username', TextType::class)
        ->add('email', EmailType::class)
        ->add('plainPassword', RepeatedType::class, array(
            'type' => PasswordType::class,
            'first_options' => array('label' => 'Password'),
            'second_options' => array('label' => 'Password confirmation')
        ))
        ->add('avatar', ModelType::class, [
            'class' => Image::class,
            'property' => 'image',
        ])
    ;
}

И, наконец, мой метод prePersist:

public function prePersist($object) { // $object is an instance of App\Entity\User as specified in services.yaml
    $plainPassword = $object->getPlainPassword();
    $container = $this->getConfigurationPool()->getContainer();
    $encoder = $container->get('security.password_encoder');
    $encoded = $encoder->encodePassword($object, $plainPassword);

    $object->setPassword($encoded);
}
0 голосов
/ 08 октября 2018

Обычно кодирование пароля происходит сразу после отправки (и проверки) формы.Возможно, вам придется продублировать две строки кода для самого шифрования в методах new и update в вашем классе пользовательских контроллеров, но это все.

...