Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Symfony - Login con usuario de base de datos sin UserInterface

4 de febrero de 2015

Estaba intentando realizar un login con los usuarios de una base de datos y en todos los tutoriales, curso, libros, etc, que he visto y he encontrado, muestran que es prácticamente una obligación utilizar el UserInterface, si se quiere realizar un login con un usuario de una base de datos.

Entonces ¿es posible realizar un login con usuarios de una base de datos sin utilizar el UserInterface? ¿Cómo puedo obtener más valores desde una clase Entity en el archivo security.yml?

¿Por qué esta duda? Porque en mi base de datos, cree un modelo donde tengo una tabla Usuarios con diferentes atributos a los que utiliza el UserInterface (están los mismos, pero tengo 3 atributos más que esa clase), entonces al momentos de querer realizar el login, no puedo configurar de buena manera el Firewall de Symfony.

Espero que me puedan ayudar, gracias.

Saludos


Respuestas

#1

Hacer un login sin usar la clase UserInterface sí que es posible, pero no es trivial. La solución consiste en crear tu propio UserProvider para Symfony y es algo que las aplicaciones muy complejas sí que usan habitualmente.

En tu caso no te aconsejo que lo utilices, porque creo que puedes resolver tu problema mucho más fácilmente. En primer lugar dices que tu tabla de usuarios tiene 3 más campos aparte de los que indica la interfaz UserInterface. Por suerte, esto no es ningún problema: casi todas las aplicaciones Symfony definen muchos más campos para sus entidades de usuarios. La interfaz te dice lo que debes definir como mínimo, no como máximo.

Ahora supongamos que tu problema es el contrario: en la tabla de usuarios no tienes los campos que te obliga a tener la interfaz UserInterface (roles, salt, password, etc.) Tampoco pasa nada. La interfaz es una clase PHP que puede definir los métodos que quiera y no tiene por qué tener una relación directa con la tabla.

Imagina que en tu tabla de la base de datos no tienes un campo para el salt. Pues en tu clase de usuario simplemente usas esto:

class Usuario implements UserInterface
{
    // ...
 
    public function getSalt()
    {
        return null;
    }
}

De la misma manera, imagina que los permisos los guardas en una columna especial llamada permiso en vez de roles y cuyos valores son propios de tu aplicación en vez de los nombres que espera Symfony. Pues la solución es tan sencilla como transformar los valores de la base de datos dentro del método getRoles():

class Usuario implements UserInterface
{
    // ...
 
    public function getRoles()
    {
        if ('editor' === $this->permiso) {
            return array('ROLE_EDITOR');
        } else {
            return array('ROLE_USER');
        }
    }
}

@javiereguiluz

4 febrero 2015, 8:51
#2

Me queda muchísimo mas claro. Muchas gracias por la excelente y rápida respuesta! Saludos

@Enzo_B16

4 febrero 2015, 16:52