entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

0voto

Lo que sucede es que cuando agrego un nuevo usuario, una ves guardado este se loguea automáticamente,y no quiero eso.
en mi aplicación solo el usuario administrador puede agregar nuevos usuarios pero cuando creo uno nuevo, la sesión actual pasa a ser o a loguearse automáticamente con el nuevo usuario.
Agradezco a quien me pueda explicar como evitar eso, Gracias.

1 Respuesta

2votos

magarzon Puntos30650

Hola.

Si estás usando la versión 1.3 del bundle, solo tienes una forma sencilla de hacerlo, que es sobreescribiendo el comando de registro de FOSUserBundle para hacer lo que tú quieras.

Aquí tienes toda la información de cómo hacerlo: http://symfony.com/doc/master/bundles/FOSUserBundle/overriding_controllers.html

Básicamente consiste en crear un bundle que sea "hijo" de FOSUserBundle (ojo, no extendiendo la clase, si no con el mecanismo que establece Symfony, en el enlace que he puesto antes lo explican), en ese bundle crear un controller que se tiene que llamar igual que el de FOSUserBundle (RegistrationController), y en ese controller sobreescribir los comandos (action) que quieras, en este caso, registerAction, y ahí haces lo que quieras, puedes copiar el action del controlador de FOSUserBundle y quitar lo que no necesites. Este sería el código del action "original", y he comentado las partes que se deberían quitar:

public function registerAction()
    {
        $form = $this->container->get('fos_user.registration.form');
        $formHandler = $this->container->get('fos_user.registration.form.handler');

        $confirmationEnabled = $this->container->getParameter('fos_user.registration.confirmation.enabled');
        $process = $formHandler->process($confirmationEnabled);
        if ($process) {
            $user = $form->getData();
            $authUser = false;
/*ESTO SE PUEDE QUITAR, NO QUIERES REDIRIGIR A NINGUN LADO DEPENDIENDO DE SI SE TIENE QUE CONFIRMAR POR MAIL O NO, PERO OJO, DEBES DEFINIR UNA VARIABLE $route CON LA RUTA DONDE QUIERES REDIRIGIR DESPUES DEL REGISTRO*/
/*            if ($confirmationEnabled) {
                $this->container->get('session')->set('fos_user_send_confirmation_email/email', $user->getEmail());
                $route = 'fos_user_registration_check_email';
            } else {
                $authUser = true;
                $route = 'fos_user_registration_confirmed';
            }
*/
            $this->setFlash('fos_user_success', 'registration.flash.user_created');

            $url = $this->container->get('router')->generate($route);
            $response = new RedirectResponse($url);

/*ESTA ES LA PARTE QUE AUTENTICA AL USUARIO, LA QUITAMOS*/
/*            if ($authUser) {
                $this->authenticateUser($user, $response);
            }*/
            return $response;
        }
        return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.'.$this->getEngine(), array(
            'form' => $form->createView(),
        ));
    }

Si estás usando la versión 2.0 del bundle, además de la opción anterior de sobreescribir el controller (aunque el código "original" del action cambia), tienes una opción más elegante. Primero, este sería el código del action en la versión 2.0, con las partes que deberías quitar comentadas:

public function registerAction(Request $request)
    {
        /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
        $formFactory = $this->get('fos_user.registration.form.factory');
        /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
        $userManager = $this->get('fos_user.user_manager');
        /** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */
        $dispatcher = $this->get('event_dispatcher');

        $user = $userManager->createUser();
        $user->setEnabled(true);

        $event = new GetResponseUserEvent($user, $request);
        $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);

        if (null !== $event->getResponse()) {
            return $event->getResponse();
        }

        $form = $formFactory->createForm();
        $form->setData($user);

        $form->handleRequest($request);

        if ($form->isValid()) {
            $event = new FormEvent($form, $request);
            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);

            $userManager->updateUser($user);

/** ESTO SE PUEDE QUITAR SI NO SE QUIERE REDIRIGIR A ESTA RUTA/ACTION EN CONCRETO **/
            if (null === $response = $event->getResponse()) {
                $url = $this->generateUrl('fos_user_registration_confirmed');
                $response = new RedirectResponse($url);
            }

/** ESTO ES LO QUE SE DEBE QUITAR PARA NO HACER AUTOLOGIN, PUES HAY UN LISTENER ESCUCHANDO ESTE EVENTO QUE ES EL QUE REALIZA EL AUTOLOGIN **/
           /* $dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));*/

            return $response;
        }

        return $this->render('FOSUserBundle:Registration:register.html.twig', array(
            'form' => $form->createView(),
        ));
    }

Pero como decía, hay una solución más elegante, que te evita tener que crear un Bundle, controller, actions, y sigues usando el código original sin tocarlo. Como comento en el código, es un Listener (en realidad un Subscriber) escuchando el evento REGISTRATION_COMPLETED el que provoca el autologin, por lo que podemos hacer es crear nuestro propio Listener, y hacer que ese Listener detenga la propagación del evento, para que no se ejecute nunca el Listener de FOSUserBundle. Se haría así:

<?php
namespace AppBundle;

use FOS\UserBundle\Event\FilterUserResponseEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

class AuthListener implements EventSubscriberInterface
{

    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_COMPLETED => 'registration',
            FOSUserEvents::REGISTRATION_CONFIRMED => 'registration'
        );
    }

    public function registration(FilterUserResponseEvent $event, $eventName = null, EventDispatcherInterface $eventDispatcher = null)
    {
//SI QUIERES PUEDES HACER MÁS COSAS AQUÍ
        $event->stopPropagation();
    }
}

Para registrar este Listener/Subscriber, en el archivo de definición de servicios services.yml, incluyes esta entrada:


services:

    auth_listener:
        class: AppBundle\AuthListener
        tags:
            - {name: kernel.event_subscriber}

Además, si tampoco quieres que se redirija al action confirmed después del registro, puedes añadir el evento FOSUserEvents::REGISTRATION_SUCCESS a la lista de eventos que nuestro subscriber escucha, y ahí crear un response con la respuesta que quieras.

Espero que haya quedado claro, si no, pregunta las dudas.

Saludos

1voto

yuliandavid comentado

Compañero muchísimas gracias, lo he realizado mediante la segunda solución y me ha funcionado, reciento estoy comenzando en symfony y estaba atascado por ese "inconveniente", nuevamente gracias!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta