<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
*
* http://www.ec-cube.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Eccube\EventListener;
use Eccube\Common\EccubeConfig;
use Eccube\Entity\Member;
use Eccube\Request\Context;
use Eccube\Service\TwoFactorAuthService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class TwoFactorAuthListener implements EventSubscriberInterface
{
/**
* @var array 2段階認証のチェックを除外するroute
*/
public const ROUTE_EXCLUDE = ['admin_two_factor_auth', 'admin_two_factor_auth_set'];
/**
* @var EccubeConfig
*/
protected $eccubeConfig;
/**
* @var Context
*/
protected $requestContext;
/**
* @var UrlGeneratorInterface
*/
protected $router;
/**
* @var TwoFactorAuthService
*/
protected $twoFactorAuthService;
/**
* @param EccubeConfig $eccubeConfig
* @param Context $context,
* @param UrlGeneratorInterface $router
* @param EncoderFactoryInterface $encoderFactory
*/
public function __construct(
EccubeConfig $eccubeConfig,
Context $requestContext,
UrlGeneratorInterface $router,
TwoFactorAuthService $twoFactorAuthService
) {
$this->eccubeConfig = $eccubeConfig;
$this->requestContext = $requestContext;
$this->router = $router;
$this->twoFactorAuthService = $twoFactorAuthService;
}
/**
* @param ControllerArgumentsEvent $event
*/
public function onKernelController(ControllerArgumentsEvent $event)
{
if (!$event->isMainRequest()) {
return;
}
if (!$this->requestContext->isAdmin()) {
return;
}
if (!$this->twoFactorAuthService->isEnabled()) {
return;
}
$route = $event->getRequest()->attributes->get('_route');
if (in_array($route, self::ROUTE_EXCLUDE)) {
return;
}
if (
($Member = $this->requestContext->getCurrentUser())
&& $Member instanceof Member
&& $Member->isTwoFactorAuthEnabled()
&& !$this->twoFactorAuthService->isAuth($Member)
) {
// トークン入力
if ($Member->getTwoFactorAuthKey()) {
$url = $this->router->generate('admin_two_factor_auth', [], UrlGeneratorInterface::ABSOLUTE_PATH);
}
// 2段階認証設定
else {
$url = $this->router->generate('admin_two_factor_auth_set', [], UrlGeneratorInterface::ABSOLUTE_PATH);
}
$event->setController(function () use ($url) {
return new RedirectResponse($url, $status = 302);
});
}
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER_ARGUMENTS => ['onKernelController', 7],
];
}
}