Сначала вы должны получить статус из ответа 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
.