Comment désactiver définitivement l'enregistrement dans FOSUserBundle

dans mon projet, je n'autorise qu'un seul utilisateur à gérer le contenu du site. Cet utilisateur sera ajouté en utilisant d'abord la ligne de commande.

maintenant, je veux obtenir l'action d'enregistrement inaccessible et je ne sais pas comment? Jusqu'à présent, je viens de mettre le ROLE_ADMIN dans le contrôle d'accès pour le registre des routes pour éviter que les visiteurs puissent aller le jeter.

des conseils?

16
demandé sur Abdou Bestmood 2015-06-29 03:37:43

7 réponses

Il existe de nombreuses façons de résoudre ce problème. Vous pouvez simplement supprimer la route fos_user_registration_register du routage.yml. Ou utilisez une solution plus compliquée: configurez l'écouteur d'événements à FOS\UserBundle\FOSUserEvents:: REGISTRATION_INITIALIZE event et redirigez l'utilisateur vers la page de connexion.

services.xml

<service id="app.registration.listener" class="AppBundle\EventListener\RegistrationListener">
    <tag name="kernel.event_subscriber" />
    <argument type="service" id="router" />
</service>

RegistrationListener.php

<?php

namespace AppBundle\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;

class RegistrationListener implements EventSubscriberInterface
{
    /**
     * @var UrlGeneratorInterface
     */
    private $router;

    /**
     * @param UrlGeneratorInterface $router
     */
    public function __construct(UrlGeneratorInterface $router) {
        $this->router = $router;
    }

    public static function getSubscribedEvents()
    {
        return [
            FOSUserEvents::REGISTRATION_INITIALIZE => 'onRegistrationInitialize',
        ];
    }

    public function onRegistrationInitialize(GetResponseUserEvent $event)
    {
        $url = $this->router->generate('fos_user_security_login');
        $response = new RedirectResponse($url);

        $event->setResponse($response);
    }
}
15
répondu Mikhail Prosalov 2017-07-08 02:25:17

regardez la configuration de routage importée de

vendeur/friendsofsymfony/utilisateur-bundle/Resources/config/routing/tous.xml

si vous voulez juste les actions de sécurité de base, importez juste

@FOSUserBundle/Resources/config/routing / security.xml

au lieu de

@FOSUserBundle/Resources/config/routing / all.xml

de Cette façon, vous pouvez simplement sélectionner quels composants (sécurité, profil, réinitialisation, change_password) vous voulez utiliser ou importer des évènements seulement des routes spécifiques à partir de ces composants.

17
répondu Petr Malina 2016-10-13 17:08:54

Vous pouvez simplement changer app/config/security.yml:

- { path: ^/register, role: ROLE_ADMIN }

Change from the default (IS_AUTHENTICATED_ANONYMOUSLY) to ROLE_ADMIN et cela empêchera les utilisateurs anonymes de se rendre au formulaire /register.

6
répondu theamoeba 2016-03-01 14:35:53

une autre solution simple (celle que j'ai utilisée) est remplacer registerAction() par défaut FOSUserBundle méthode du contrôleur:

namespace Acme\UserBundle\Controller;

use FOS\UserBundle\Controller\RegistrationController as FOSRegistrationController;
use Symfony\Component\HttpFoundation\Request;

class RegistrationController extends FOSRegistrationController
{
    public function registerAction(Request $request)
    {
        return $this->redirectToRoute('getStarted', array(), 301);
    }
}

faire ceci laissera actif d'autres routes, comme la page de confirmation.

j'ai simplement surligné l'action register et redirigé l'utilisateur vers ma première page d'enregistrement (getStarted).

3
répondu Aerendir 2015-09-01 13:01:00
denyAll comme ceci:

- { path: ^/register, access: denyAll }

1
répondu nurikabe 2017-03-04 03:24:14

C'est comment je résoudre ce problème...

vous devez d'Abord définir votre auditeur dans les services.fichier yml:

services:
    registrationListner:
      class: App\YourBundle\Listener\RegistrationListener
      arguments: [@service_container]
      tags:
    - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest}

alors créez votre classe RegistrationListener:

<?php
namespace App\YourBundle\Listener;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class RegistrationListener
{
private $router;

public function __construct(ContainerInterface $container){
    $this->router = $container->get('router');
}

public function onKernelRequest(GetResponseEvent $event)
{

    $route = $event->getRequest()->attributes->get('_route');
    if ($route == 'fos_user_registration_register') {
        //here we're gonna to redirect to you_route for example, I guess in the most cases it will be the index...
        $event->setResponse(new RedirectResponse($this->router->generate('your_route'))); 
    }
}
}

j'Espère que ça aide.

0
répondu Abdou Bestmood 2015-06-29 14:09:35

Vous pouvez essayer de modifier votre itinéraire.yml

fos_user_registration_register:
    path:  /register{trailingSlash}
    defaults: { _controller: AcmeBundle:Default:register, trailingSlash : "/" }
    requirements: { trailingSlash : "[/]{0,1}" }

    public function registerAction(Request $request)
    {
       
        return $this->redirectToRoute('404OrWhatYouWant');
    }
0
répondu Jerome Diaz 2018-09-14 16:12:47