Skip to content

Commit

Permalink
Merge pull request #18 from SimLibaud/sf5_twig3
Browse files Browse the repository at this point in the history
Sf5 + Twig 3 compliant
  • Loading branch information
SimLibaud committed Aug 30, 2021
2 parents cf34acc + 6240e76 commit 05c8b6e
Show file tree
Hide file tree
Showing 8 changed files with 47 additions and 38 deletions.
2 changes: 1 addition & 1 deletion Event/AccessDeniedToRouteEvent.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*/
namespace Sil\RouteSecurityBundle\Event;

use Symfony\Component\EventDispatcher\Event;
use Symfony\Contracts\EventDispatcher\Event;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\HttpFoundation\Response;
Expand Down
9 changes: 5 additions & 4 deletions Listener/AccessControlListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
use Sil\RouteSecurityBundle\Exception\LogicException;
use Sil\RouteSecurityBundle\Security\AccessControl;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\User\UserInterface;
Expand All @@ -33,9 +33,10 @@ public function __construct(AccessControl $accessControl, TokenStorageInterface
}

/**
* @param GetResponseEvent $event
* @param RequestEvent $event
* @return RequestEvent|void
*/
public function onKernelRequest(GetResponseEvent $event)
public function onKernelRequest(RequestEvent $event)
{
$route = $event->getRequest()->attributes->get('_route');

Expand All @@ -55,7 +56,7 @@ public function onKernelRequest(GetResponseEvent $event)

if (false === $this->accessControl->hasUserAccessToRoute($user, $route)) {
$access_denied_event = new AccessDeniedToRouteEvent($user, $event->getRequest());
$this->eventDispatcher->dispatch(AccessDeniedToRouteEvent::ON_ACCESS_DENIED_TO_ROUTE, $access_denied_event);
$this->eventDispatcher->dispatch($access_denied_event, AccessDeniedToRouteEvent::ON_ACCESS_DENIED_TO_ROUTE);

if (true === $access_denied_event->hasResponse()) {
$event->setResponse($access_denied_event->getResponse());
Expand Down
2 changes: 1 addition & 1 deletion Resources/config/services.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@

<service id="sil_route_security.access_control_listener" class="Sil\RouteSecurityBundle\Listener\AccessControlListener">
<argument type="service" id="sil_route_security.access_control"></argument>
<argument type="service" id="security.token_storage"></argument>
<argument type="service" id="security.untracked_token_storage"></argument>
<argument type="service" id="event_dispatcher"></argument>
<tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" priority="4"/>
</service>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@ public function testDefaultNamingStrategy()
{
$container = new ContainerBuilder();
$container->setParameter('sil_route_security.naming_strategy', null);
$container->register('sil_route_security.route_to_role_converter', $this->createMock(RouteToRoleConverter::class));
$container->register('router', new \stdClass());
$container->register('sil_route_security.route_to_role_converter', RouteToRoleConverter::class);
$container->register('router', null);
$container
->register('sil_route_security.access_control')
->addArgument(new Reference('router'))
->addArgument(new Reference('sil_route_security.route_to_role_converter'))
;
$container
->register('sil_route_security.route_security_tools', new \stdClass())
->register('sil_route_security.route_security_tools', null)
->addArgument(new Reference('sil_route_security.access_control'))
->addArgument(new Reference('sil_route_security.route_to_role_converter'))
;
Expand All @@ -39,16 +39,16 @@ public function testOverridesNamingStrategy()
{
$container = new ContainerBuilder();
$container->setParameter('sil_route_security.naming_strategy', 'my_own_naming_strategy');
$container->register('my_own_naming_strategy', $this->createMock(NamingStrategyInterface::class));
$container->register('sil_route_security.route_to_role_converter', $this->createMock(RouteToRoleConverter::class));
$container->register('router', new \stdClass());
$container->register('my_own_naming_strategy', NamingStrategyInterface::class);
$container->register('sil_route_security.route_to_role_converter', RouteToRoleConverter::class);
$container->register('router', null);
$container
->register('sil_route_security.access_control')
->addArgument(new Reference('router'))
->addArgument(new Reference('sil_route_security.route_to_role_converter'))
;
$container
->register('sil_route_security.route_security_tools', new \stdClass())
->register('sil_route_security.route_security_tools', null)
->addArgument(new Reference('sil_route_security.access_control'))
->addArgument(new Reference('sil_route_security.route_to_role_converter'))
;
Expand Down
27 changes: 14 additions & 13 deletions Tests/Listener/AccessControlListenerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\HttpFoundation\ParameterBag;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\User\UserInterface;
Expand All @@ -27,7 +27,7 @@ public function testWhenAccessControlIsDisabled()
->willReturn(false);
$tokenStorage = $this->createMock(TokenStorageInterface::class);
$eventDispatcher = $this->createMock(EventDispatcherInterface::class);
$event = $this->mockGetResponseEvent();
$event = $this->mockRequestEvent();

$accessControlListener = new AccessControlListener($accessControl, $tokenStorage, $eventDispatcher);
$accessControlListener->onKernelRequest($event);
Expand All @@ -47,7 +47,7 @@ public function testWithNonSecureRoute()
->willReturn(false);
$tokenStorage = $this->createMock(TokenStorageInterface::class);
$eventDispatcher = $this->createMock(EventDispatcherInterface::class);
$event = $this->mockGetResponseEvent('non_secure_route');
$event = $this->mockRequestEvent('non_secure_route');

$accessControlListener = new AccessControlListener($accessControl, $tokenStorage, $eventDispatcher);
$accessControlListener->onKernelRequest($event);
Expand All @@ -70,7 +70,7 @@ public function testWithEmptyTokenStorage()
->method('getToken')
->willReturn(null);
$eventDispatcher = $this->createMock(EventDispatcherInterface::class);
$event = $this->mockGetResponseEvent('secure_route');
$event = $this->mockRequestEvent('secure_route');

$accessControlListener = new AccessControlListener($accessControl, $tokenStorage, $eventDispatcher);
$this->expectException(LogicException::class);
Expand All @@ -96,7 +96,7 @@ public function testWithInvalidTokenStorage()
->method('getToken')
->willReturn($token);
$eventDispatcher = $this->createMock(EventDispatcherInterface::class);
$event = $this->mockGetResponseEvent('secure_route');
$event = $this->mockRequestEvent('secure_route');

$accessControlListener = new AccessControlListener($accessControl, $tokenStorage, $eventDispatcher);
$this->expectException(LogicException::class);
Expand All @@ -118,7 +118,7 @@ public function testWithCorrectAccessForUser()
->willReturn(true);
$tokenStorage = $this->mockTokenStorage();
$eventDispatcher = $this->createMock(EventDispatcherInterface::class);
$event = $this->mockGetResponseEvent('secure_route');
$event = $this->mockRequestEvent('secure_route');

$accessControlListener = new AccessControlListener($accessControl, $tokenStorage, $eventDispatcher);
$this->assertNull($accessControlListener->onKernelRequest($event));
Expand All @@ -139,7 +139,7 @@ public function testWithIncorrectAccessForUser()
->willReturn(false);
$tokenStorage = $this->mockTokenStorage();
$eventDispatcher = $this->createMock(EventDispatcherInterface::class);
$event = $this->mockGetResponseEvent('secure_route');
$event = $this->mockRequestEvent('secure_route');

$accessControlListener = new AccessControlListener($accessControl, $tokenStorage, $eventDispatcher);
$this->expectException(AccessDeniedException::class);
Expand All @@ -160,24 +160,25 @@ public function testWithIncorrectAccessForUserAndCustomResponse()
->method('hasUserAccessToRoute')
->willReturn(false);
$tokenStorage = $this->mockTokenStorage();
$event = $this->mockGetResponseEvent('secure_route');
$event = $this->mockRequestEvent('secure_route');
$eventDispatcher = $this->createMock(EventDispatcherInterface::class);
$response = new Response('Custom Response');
$eventDispatcher
->expects($this->once())
->method('dispatch')
->with(AccessDeniedToRouteEvent::ON_ACCESS_DENIED_TO_ROUTE, $this->isInstanceOf(AccessDeniedToRouteEvent::class))
->will($this->returnCallback(function ($name, $access_denied_event) use ($response) {
->with($this->isInstanceOf(AccessDeniedToRouteEvent::class), AccessDeniedToRouteEvent::ON_ACCESS_DENIED_TO_ROUTE)
->will($this->returnCallback(function ($access_denied_event, $name) use ($response) {
$access_denied_event->setResponse($response);
return $access_denied_event;
}));

$accessControlListener = new AccessControlListener($accessControl, $tokenStorage, $eventDispatcher);
$this->assertInstanceOf(GetResponseEvent::class, $accessControlListener->onKernelRequest($event));
$this->assertInstanceOf(RequestEvent::class, $accessControlListener->onKernelRequest($event));
}

protected function mockGetResponseEvent($route = null)
protected function mockRequestEvent($route = null)
{
$event = $this->createMock(GetResponseEvent::class);
$event = $this->createMock(RequestEvent::class);
$request = $this->createMock(Request::class);
$parameterBag = $this->createMock(ParameterBag::class);
$parameterBag
Expand Down
10 changes: 6 additions & 4 deletions Twig/RouteSecurityExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@
namespace Sil\RouteSecurityBundle\Twig;

use Sil\RouteSecurityBundle\Security\AccessControl;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

/**
* Class RouteSecurityExtension.
*/
class RouteSecurityExtension extends \Twig_Extension
class RouteSecurityExtension extends AbstractExtension
{
private $accessControl;

Expand All @@ -23,9 +25,9 @@ public function __construct(AccessControl $accessControl)
public function getFunctions()
{
return [
new \Twig_SimpleFunction('hasUserAccessToRoute', [$this->accessControl, 'hasUserAccessToRoute']),
new \Twig_SimpleFunction('hasUserAccessToRoutes', [$this->accessControl, 'hasUserAccessToRoutes']),
new \Twig_SimpleFunction('hasUserAccessAtLeastOneRoute', [$this->accessControl, 'hasUserAccessAtLeastOneRoute']),
new TwigFunction('hasUserAccessToRoute', [$this->accessControl, 'hasUserAccessToRoute']),
new TwigFunction('hasUserAccessToRoutes', [$this->accessControl, 'hasUserAccessToRoutes']),
new TwigFunction('hasUserAccessAtLeastOneRoute', [$this->accessControl, 'hasUserAccessAtLeastOneRoute']),
];
}
}
4 changes: 2 additions & 2 deletions WebProfiler/RouteSecurityTools.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ public function __construct(AccessControl $accessControl, NamingStrategyInterfac
/**
* @param Request $request
* @param Response $response
* @param \Exception|null $exception
* @param \Throwable|null $exception
*/
public function collect(Request $request, Response $response, \Exception $exception = null)
public function collect(Request $request, Response $response, \Throwable $exception = null)
{
$this->data['is_access_control_enable'] = $this->accessControl->isEnable();
$route = $request->get('_route');
Expand Down
17 changes: 11 additions & 6 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@
}
],
"require": {
"php": "~5.6 || ~7.0",
"symfony/framework-bundle": "^2.7 || ^3.0 || ^4.0",
"symfony/security": "^2.7 || ^3.0 || ^4.0",
"symfony/yaml": "^2.7 || ^3.0 || ^4.0",
"symfony/expression-language": "^2.7 || ^3.0 || ^4.0",
"twig/twig": "^1.28 || ^2.0"
"php": "~7.2",
"symfony/framework-bundle": "^5.0",
"symfony/security-core": "^5.0",
"symfony/yaml": "^5.0",
"symfony/expression-language": "^5.0",
"twig/twig": "^3.0"
},
"require-dev": {
"phpunit/phpunit": "^5.7 || ^6.0"
Expand All @@ -28,5 +28,10 @@
"exclude-from-classmap": [
"/Tests/"
]
},
"scripts": {
"test": [
"vendor/bin/phpunit"
]
}
}

0 comments on commit 05c8b6e

Please sign in to comment.