Browse Source

Merge pull request #737 from mhujer/logged-in-user-cannot-register

Logged in user is redirected to homepage when accessing registration page
Jordi Boggiano 8 years ago
parent
commit
3245acd5b4

+ 57 - 0
src/Packagist/WebBundle/EventListener/LoggedInUserCannotRegisterListener.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace Packagist\WebBundle\EventListener;
+
+use FOS\UserBundle\Event\GetResponseUserEvent;
+use FOS\UserBundle\FOSUserEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
+use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter;
+
+/**
+ * Redirect logged in user to the homepage when accessing registration page
+ */
+class LoggedInUserCannotRegisterListener implements EventSubscriberInterface
+{
+    /** @var \Symfony\Component\Security\Core\Authorization\AuthorizationChecker */
+    private $authorizationChecker;
+
+    /** @var \Symfony\Component\Routing\Generator\UrlGeneratorInterface */
+    private $router;
+
+    public function __construct(
+        AuthorizationChecker $authorizationChecker,
+        UrlGeneratorInterface $router
+    )
+    {
+        $this->authorizationChecker = $authorizationChecker;
+        $this->router = $router;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function getSubscribedEvents()
+    {
+        return [
+            FOSUserEvents::REGISTRATION_INITIALIZE => 'onRegistrationInitialize',
+        ];
+    }
+
+    /**
+     * @param \FOS\UserBundle\Event\GetResponseUserEvent $event
+     */
+    public function onRegistrationInitialize(GetResponseUserEvent $event)
+    {
+        // don't do anything if the user is not logged in
+        if (!$this->authorizationChecker->isGranted(AuthenticatedVoter::IS_AUTHENTICATED_REMEMBERED)) {
+            return;
+        }
+
+        $homepageUrl = $this->router->generate('home');
+        $redirectResponse = new RedirectResponse($homepageUrl);
+        $event->setResponse($redirectResponse);
+    }
+}

+ 8 - 0
src/Packagist/WebBundle/Resources/config/services.yml

@@ -15,6 +15,14 @@ services:
         tags:
             - { name: kernel.event_listener, event: kernel.response, method: onResponse }
 
+    packagist.logged_in_user_cannot_register_listener:
+        class: Packagist\WebBundle\EventListener\LoggedInUserCannotRegisterListener
+        arguments:
+            - '@security.authorization_checker'
+            - '@router'
+        tags:
+            - { name: kernel.event_subscriber }
+
     packagist.registration_listener:
         class: Packagist\WebBundle\EventListener\RegistrationListener
         arguments: [ '@fos_user.util.token_generator' ]