Sylius Security: форма входа в Google reCaptcha - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь добавить ReCaptcha в форму входа Sylius, я установил stefandoorn / sylius-recaptcha-plugin и выполнил все инструкции по установке, но он не проверяется, форма регистрируется, даже когда капча поле пусто, ошибка не выдается. В настоящее время я использую Sylius v1.7

Вид работает нормально и выглядит так: Войти с помощью captcha Я расширил SecurityLoginType и создал расширение:

<?php

declare(strict_types=1);

namespace App\Form\Extension;

use EWZ\Bundle\RecaptchaBundle\Form\Type\EWZRecaptchaType;
use EWZ\Bundle\RecaptchaBundle\Validator\Constraints\IsTrue as RecaptchaTrue;
use Sylius\Bundle\UiBundle\Form\Type\SecurityLoginType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilderInterface;

class SecurityLoginTypeExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder->add('_recaptcha', EWZRecaptchaType::class, [
            'mapped' => false,
            'constraints' => [
                new RecaptchaTrue(),
            ],
            'attr' => [
                'defer' => true,
                'async' => true,
            ],
        ]);
    }

    public static function getExtendedTypes(): iterable
    {
        return [SecurityLoginType::class];
    }
}

И зарегистрируйте расширение в config / services.yml

app.form.extension.type.security_login:
        class: App\Form\Extension\SecurityLoginTypeExtension
        tags:
            - { name: form.type_extension, extended_type: Sylius\Bundle\UiBundle\Form\Type\SecurityLoginType }

И переопределите временный вход в SyliusUiBundle / Security / _login. html .twig

...
{% form_theme form '@EWZRecaptcha/Form/ewz_recaptcha_widget.html.twig' %}

{{ form_errors(form._recaptcha) }}
{{ form_widget(form._recaptcha, { 'attr': {
    'options' : {
        'theme': 'light',
        'type': 'image',
        'size': 'normal'
    },
} }) }}
...

Любые предложения по этому поводу. Заранее спасибо.

1 Ответ

0 голосов
/ 03 сентября 2020

Наконец, я нашел способ к этому, поскольку я использую пакет FOS symfony внутренне не проверяет саму форму входа, и тогда нам нужно перехватить форму входа до ее обработки. Я добавил подписчика событий на KernelEvents::REQUEST с приоритетом 9, потому что класс Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener (отвечающий за регистрацию событий для symfony брандмауэра) имеет приоритет 8.

Вот код, он объясняется сам по себе :

<?php

declare(strict_types=1);

namespace App\EventSubscriber;

use Sylius\Bundle\UiBundle\Form\Type\SecurityLoginType;
use Symfony\Component\HttpKernel\Event\RequestEvent;

class LoginSubscriber implements EventSubscriberInterface
{

    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::REQUEST => ['onLogin', 9]
        ];
    }

    /**
     * @param RequestEvent $event
     */
    public function onLogin(RequestEvent $event)
    {
        // Check for login route name
        if ('sylius_shop_login_check' !== $event->getRequest()->attributes->get('_route')) {
            return;
        }

        // Get the login form
        $loginForm = $this->formFactory->createNamed(null, SecurityLoginType::class);

        $loginForm->handleRequest($event->getRequest());

        if ($loginForm->isSubmitted() && !$loginForm->isValid()) {
            // And here code when the form is invalid
        }
    }
}

Хочу сказать спасибо сообществу. Этот пост был очень полезен для меня: Добавить слушателя перед входом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...