Passed
Push — master ( fcabc1...64f2a1 )
by Simon
02:24
created

AccessControlListener::onKernelRequest()   C

Complexity

Conditions 7
Paths 3

Size

Total Lines 29
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 29
rs 6.7272
cc 7
eloc 15
nc 3
nop 1
1
<?php
2
3
/**
4
 * User: Simon Libaud
5
 * Date: 19/03/2017
6
 * Email: [email protected].
7
 */
8
namespace Sil\RouteSecurityBundle\Listener;
9
10
use Sil\RouteSecurityBundle\Event\AccessDeniedToRouteEvent;
11
use Sil\RouteSecurityBundle\Exception\LogicException;
12
use Sil\RouteSecurityBundle\Security\AccessControl;
13
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
14
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
15
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
16
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
17
use Symfony\Component\Security\Core\User\UserInterface;
18
19
/**
20
 * Class AccessControlListener.
21
 */
22
class AccessControlListener
23
{
24
    private $accessControl;
25
    private $tokenStorage;
26
    private $eventDispatcher;
27
28
    public function __construct(AccessControl $accessControl, TokenStorageInterface $tokenStorage, EventDispatcherInterface $eventDispatcher)
29
    {
30
        $this->accessControl = $accessControl;
31
        $this->tokenStorage = $tokenStorage;
32
        $this->eventDispatcher = $eventDispatcher;
33
    }
34
35
    /**
36
     * @param GetResponseEvent $event
37
     */
38
    public function onKernelRequest(GetResponseEvent $event)
39
    {
40
        $route = $event->getRequest()->attributes->get('_route');
41
42
        if (false === $this->accessControl->isEnable() || false === $this->accessControl->isRouteSecure($route)) {
43
            return;
44
        }
45
46
        if (null === $this->tokenStorage->getToken()) {
47
            throw new LogicException('Unable to retrive the current user. The token storage does not contain security token.');
48
        }
49
50
        if (false === $this->tokenStorage->getToken()->getUser() instanceof UserInterface) {
51
            throw new LogicException(sprintf('The security token must containt an User object that implements %s', UserInterface::class));
52
        }
53
54
        $user = $this->tokenStorage->getToken()->getUser();
55
56
        if (false === $this->accessControl->hasUserAccessToRoute($user, $route)) {
57
            $access_denied_event = new AccessDeniedToRouteEvent($user, $event->getRequest());
58
            $this->eventDispatcher->dispatch(AccessDeniedToRouteEvent::ON_ACCESS_DENIED_TO_ROUTE, $access_denied_event);
59
60
            if (true === $access_denied_event->hasResponse()) {
61
                $event->setResponse($access_denied_event->getResponse());
62
63
                return $event;
64
            }
65
66
            throw new AccessDeniedException();
67
        }
68
    }
69
}
70