Перехватить Войти в Symfony - PullRequest
0 голосов
/ 10 июня 2019

Я создаю приложение Symfony, которое использует AWS Cognito в качестве провайдера входа в систему.

Нашел отличное руководство на mybuilder.com Это работает, как и ожидалось.

Проблема, с которой я столкнулся, заключается в том, что я хочу показать страницу до того, как пользователь полностью войдет в систему.

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

Буду благодарен за любые указатели.

Ответы [ 2 ]

1 голос
/ 11 июня 2019

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

Обратите внимание в документах на:

$user = $this->userProvider->loadUserByUsername($token->getUsername());

С помощью этой строки кода вы можете ввести своего пользователя в систему.

Также вы можете прочитать об аутентификации JSON Web Token, используя те же принципы, что и там:

https://symfony.com/doc/current/security/custom_authentication_provider.html#the-authentication-provider

Вторая ссылка:

JSON Web Token symfonycasts

0 голосов
/ 11 июня 2019

Сначала вы должны получить статус из ответа AWS.(Возможно, было бы лучше использовать атрибуты. $result['Users'][0]['Attributes'])

class UserProvider implements UserProviderInterface
{
    // ...
    public function loadUserByUsername($username)
    {
       // ...

        if ($result['Users'][0]['UserStatus'] === 'FORCE_CHANGE_PASSWORD') {
            $user->setForcePasswordChange(true);
        }

        return $user;
    }
   // ...
}

Затем мне пришлось создать прослушиватель контроллера.

<?php

namespace App\EventSubscriber;

use App\Controller\Layout\EsiController;
use App\Controller\Account\UserController;
use App\Security\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

class ForcedPasswordSubscriber implements EventSubscriberInterface
{
    private $token;
    private $controller;


    public function __construct(TokenStorageInterface $token, UserController $controller)
    {
        $this->token = $token;
        $this->controller = $controller;
    }

    public function onKernelController(ControllerEvent $event)
    {
        $controller = $event->getController();

        /*
         * $controller passed can be either a class or a Closure.
         * This is not usual in Symfony but it may happen.
         * If it is a class, it comes in array format
         */
        if (!is_array($controller) || !$this->token->getToken()
            || $controller[0] instanceof EsiController
            || $controller[0] instanceof UserController
        ) {
            return;
        }

        $user = $this->token->getToken()->getUser();

        if (!$user instanceof User){
            return;
        }

        if (!$user->hasForcePasswordChange()) {
            return;
        }

        $controller = $this->controller;

        $event->setController(function () use ($controller) {
            return $controller->password();
        });
    }

    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::CONTROLLER => 'onKernelController',
        ];
    }
}

Этот код просто выводит сообщение Force password changeТем не менее, это хорошая отправная точка.

Если вы хотите заставить пользователя согласиться с обновленными положениями и условиями, то он похож, но вам просто нужно разобраться в Subscriber, а небеспокоиться о методе loadUserByUsername.

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