Как перенаправить с помощью addFlash из класса, который реализует Symfony 4 UserCheckerInterface - PullRequest
0 голосов
/ 23 сентября 2019

Мне нужна твоя помощь.Я настроил систему активации учетной записи по адресу электронной почты, который работает очень хорошо.

В настоящее время мне удается отказать в доступе, но я не знаю, как сделать перенаправление с addFlash и не отображать пропуск 403.

У вас будет представление о том, как я могу это сделать?

Вот как я запрещаю доступ, я использую UserChecker.

class UserChecker implements UserCheckerInterface
{
    /**
     * Checks the user account before authentication.
     *
     * @param UserInterface $user
     * @return RedirectResponse
     */
    public function checkPreAuth(UserInterface $user)
    {
        if ($user->getIsActivated() === null || $user->getIsActivated() === false) {
            throw new HttpException(403, 'Access denied.');
        } else {
            return new RedirectResponse('account_login');
        }
    }

1 Ответ

0 голосов
/ 23 сентября 2019

Создайте исключение, которое расширяет AccountStatusException от вашего UserCheckerInterface.Например:

use Symfony\Component\Security\Core\Exception\DisabledException;

// ...
throw new DisabledException('User account is disabled.');

И прослушайте это исключение следующим образом:

// src/EventSubscriber/ExceptionSubscriber.php
namespace App\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class ExceptionSubscriber implements EventSubscriberInterface
{
    /**
     * @var FlashBagInterface
     */
    private $flashBag;

    /**
     * @var UrlGeneratorInterface
     */
    private $router;

    public function __construct(SessionInterface $session, UrlGeneratorInterface $router) 
    {
        $this->flashBag = $session->getFlashBag();
        $this->router = $router;
    }

    public static function getSubscribedEvents()
    {
        // return the subscribed events, their methods and priorities
        return [
            KernelEvents::EXCEPTION => 'onException',
        ];
    }

    public function onException(ExceptionEvent $event)
    {
        // You get the exception object from the received event
        $exception = $event->getException();

        if (!$exception instanceof DisabledException) {
            return;
        }

        $this->flashBag->add(
            'warning',
            $exception->getMessage()
        );

        $response = new RedirectResponse($this->router->generate('homepage'));
        $exception->setResponse($response);     
    }
}

Если вы используете default.yaml, этого достаточно.

Дополнительная информация о событииподписчики: https://symfony.com/doc/current/event_dispatcher.html#creating-an-event-subscriber

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