<?php
namespace App\EventListener;
use App\AbstractClass\Controller\AbstractController;
use App\Component\Authenticator\Authenticator as UserAuthenticator;
use App\Component\Authenticator\Firewall;
use App\Component\Response\Response;
use Exception;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
class Authenticator extends AbstractController
{
/**
* @var UserAuthenticator
*/
private $authenticator;
/**
* @var Response
*/
private $response;
function __construct(UserAuthenticator $authenticator, Response $response)
{
$this->authenticator = $authenticator;
$this->response = $response;
}
/**
* Authentication checker before controller execution.
*
* @param ControllerEvent $event
*
* @throws Exception
*/
public function onKernelController(ControllerEvent $event)
{
if(!$event->isMasterRequest()) {
return;
}
$controller = $event->getRequest()->get('_controller');
if($controller === 'error_controller') {
return;
}
$controllerParts = explode(strpos($controller, '::') !== false ? '::' : ':', $controller, 2);
$controllerClass = $controllerParts[0];
$controllerAction = $controllerParts[1];
$firewall = new Firewall($controllerClass);
$protectedActions = $firewall->getProtectedActions();
if ($firewall->needsAuthorization() && !$this->authenticator->isAuthenticated()) {
$event->setController(function() {
return $this->response->unauthorized();
});
return;
}
if (count($protectedActions) && in_array($controllerAction, $protectedActions) && !$this->authenticator->hasPermission()) {
$event->setController(function() {
return $this->response->noPermissions();
});
}
}
}