Limitar el acceso a las vistas del FOSUserBundle de un usuario logeado

Uno de los problemas que más suele ocurrir cuando usamos FOSUserBundle en nuestros proyectos, es que el usuario puede acceder a las rutas de login, registro, etc. una vez esta logeado y en la gran mayoria de los casos, no queremos que tenga acceso porque ya no lo necesita o porque no procede en la logica de negocio de la aplicación.

Para prevenir justamente esto, he desarrollado una solucion que me parece bastante sencilla y que hace justamente lo que queremos sin complicaciones.

Para ello, creamos un nuevo controlador llamado SecurityController que hereda del SecurityController del FOSUserBundle dentro de nuestro bundle de Usuarios, y creamos un nuevo loginAction que sobrescribe y atiende a la ruta del FOSUserBundle, de la siguiente forma:

use...
class SecurityController extends \FOS\UserBundle\Controller\SecurityController
{
/**
 * @param Request $request
 * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
 *
 * @Route("/login", name="login")
 */
public function loginAction(Request $request)
{
 if($this->getUser() instanceof User){
     return $this->redirect($this->generateUrl('dashboard_homepage'));
 }
 return parent::loginAction($request);
}
}

De esta forma cuando se intente acceder al login, se comprueba si esta logeado, y se redirige a la homepage o por el contrario, llamamos al login action del FOSUserBundle el cual nos devuelve la vista del login con sus parametros y demás.

Esto mismo se puede extrapolar al registro o otras acciones que no queramos que el usuario acceda una vez se a logeado satisfactoriamente.

Me parece una solucion sencilla y elegante y que no se acopla, sino que si en algun momento actualizan las acciones del FOSUserBundle, seguiremos teniendo la logica del bundle intacta.

En otros sitios, comentan de hacer un copy – paste del codigo del action y adaptarlo a nuestra logica de negocio, pero esa solucion es mala, ya que si cambian algo de los “action” del bundle en futuras actualizaciones del bundle, estamos muy pero que muy “jodidos”.

Compartid por favor ¡¡ Y felices fiestas ¡¡

 

Anuncios

2 comentarios en “Limitar el acceso a las vistas del FOSUserBundle de un usuario logeado

  1. Buenas noches David.

    Buscando una solución a mi problema he encontrado tu blog y ya lo he guardado en favoritos.

    Estoy desarrollando una aplicación en Symfony y utilizo fosuserbundle para el control de usuarios. En la aplicación tengo que seleccionar a que sucursal me conecto y en base a la selección conecta con una bd u otra.
    Cada bd tiene su propia tabla de usuarios.
    El problema es que no consigo configurar fosuserbundle para indicarle con que base de datos trabajar.
    ¿Sabes que es lo que tengo que hacer?
    Bueno, a ver si me puedes echar una mano.

    Un saludo,

    Inma.

    Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s