Nano Hash - криптовалюты, майнинг, программирование

Sylius Security: форма входа в систему Google reCaptcha

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

Представление работает хорошо и выглядит следующим образом: Войти с капчей Я расширил 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'
    },
} }) }}
...

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


  • См. github.com/excelwebzone/EWZRecaptchaBundle, как использовать валидатор recaptcha. Сначала убедитесь, что он включен, лол. Также убедитесь, что вы используете ту же группу проверки в форме входа, обычно в Sylius это sylius, но вы не установили группу проверки AFAICT. 19.06.2020
  • emix, пакет EWZRecaptchaBundle Bundle включен и хорошо работает в контактной форме и форме регистрации, но, что любопытно, в форме входа он не работает. Я попытался установить sylius в качестве группы проверки, но результат был таким же, я думаю, проблема может быть в SecurityLoginType и в том, как он используется фреймворком, потому что он не проверял никаких ограничений. 20.06.2020
  • Мне кажется, что это связано с тем, как Symfony проверяет это внутри. Я не могу вам помочь прямо сейчас, но если вы узнаете, не хотели бы вы отправить PR в репозиторий плагинов, чтобы мы могли включить его и для других пользователей? 21.06.2020

Ответы:


1

Наконец, я нашел способ сделать это, поскольку я использую пакет 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
        }
    }
}

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

02.09.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..