CSRF недействителен из-за двух лиц в процессе регистрации - PullRequest
1 голос
/ 04 февраля 2020

У меня есть две сущности и одна форма для процесса регистрации. Когда я добавляю токен csrf, он, вероятно, работает для одной из них , а не для обеих.

<form action="" method="post" class="registerForm" id="registerForm" novalidate>
    <div class="form-row">
        <div class="form-group col-lg-6">
            <input type="text" class="form-control inner-blue-shadow" name="company[name]" id="companyName" placeholder="Име на фирма" required/>
            <div class="invalid-feedback"></div>
            <div class="valid-feedback"></div>
        </div>
        <div class="form-group col-lg-6">
            <input type="text" class="form-control inner-blue-shadow" name="company[bulstat]" id="bulstat" placeholder="Булстат" required/>
            <div class="invalid-feedback"></div>
            <div class="valid-feedback"></div>
        </div>
    </div>
    <div class="form-group">
        <input type="text" class="form-control inner-blue-shadow" name="user[username]" id="username" placeholder="Потребителско име" required/>
        <div class="invalid-feedback"></div>
        <div class="valid-feedback"></div>
    </div>
    <div class="form-group">
        <input type="email" class="form-control inner-blue-shadow" name="user[email]" id="email" placeholder="Имейл адрес" required/>

    </div>
    <div class="form-group">
        <input type="password" class="form-control inner-blue-shadow" name="user[password]" id="password" placeholder="Парола" required/>
        <div class="invalid-feedback"></div>
        <div class="valid-feedback"></div>
    </div>
    {{ form_row(form._token) }}
    <div class="text-center"><button type="submit" id="registerButton">Create account</button></div>
</form>

Вывод : "user__token", поэтому, насколько я вижу, он генерирует его, за исключением того, что он затрагивает только одну из двух сущностей - Пользователь и это делает не работает для другого.

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

Формы:

1.User

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $schools = $this->schoolRepository->findAll();

    $builder
        ->add('username', TextType::class)
        ->add('email', EmailType::class)
        ->add('password', PasswordType::class)
}

/**
 * {@inheritdoc}
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\User',
        'csrf_protection' => true,
        'csrf_field_name' => '_token',
        'csrf_token_id'   => 'task_item'
    ));
}

2.Компания:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('name', TextType::class);
    $builder->add('bulstat', TextType::class);
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Company',
        'csrf_protection' => true,
        'csrf_field_name' => '_token',
        'csrf_token_id'   => 'task_item'
    ));
}

Контроллер, в котором создаются формы:

$company = new Company();
$companyForm = $this->createForm(CompanyType::class, $company);
$companyForm->handleRequest($request);

$user = new User();
$userForm = $this->createForm(UserType::class, $user);
$userForm->handleRequest($request);

Как это исправить?

1 Ответ

1 голос
/ 04 февраля 2020

Это в основном вопрос о том, как объединить две сущности в одну форму. Есть и другие вопросы, которые касаются этого, но некоторые устарели и устарели. Этот вопрос также является примером того, как не воспользоваться тем, что может предложить Symfony, и работать немного сложнее, чем разработчик.

В частности, Symfony имеет дело с csrf из коробки и не требует специальной настройки. Вы можете делать больше с ним, но проще начать с работающей реализации по умолчанию, а затем настроить при необходимости. Аналогичным образом, веточка имеет рендеринг формы по умолчанию. После того, как форма заработает, вы можете использовать различные инструменты для стилизации, чтобы она выглядела красиво.

Начните с упрощения ваших классов EntityType и добавления RegisterType:

class UserType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => User::class,
        ));
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username', TextType::class)
            ->add('email', EmailType::class)
            ->add('password', PasswordType::class);
    }
}
class CompanyType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Company::class,
        ));
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class)
            ->add('bulstat', TextType::class);
    }
}
class RegisterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('user', UserType::class)
            ->add('company', CompanyType::class)
            ->add('register', SubmitType::class);
    }
}

Теперь настройте код контроллера и используйте рендеринг формы по умолчанию:

    public function register(Request $request)
    {
        $user = new User();
        $company = new Company();
        $register = ['user' => $user, 'company' => $company];

        $form = $this->createForm(RegisterType::class, $register);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            dump($user);
            dump($company);
        }

        return $this->render('register.html.twig',['form' => $form->createView()]);
    }
# register.html.twig
{% extends 'base.html.twig' %}
{% block body %}
    <h1>Register</h1>
    {{ form(form) }}
{% endblock %}

На данный момент у вас должна быть рабочая форма. Затем вы можете добавить проверку и постоянство, а также придать форме красивый вид.

...