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?
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);
}
}
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.
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.
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).
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.
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');
}