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

Sesión de usuario personalizada

21 de octubre de 2015

Saludos.

Estoy trabajando en un modulo de autoconsulta. Los personas tienen acceso a través de una tarjeta HID Proximidad. Mi duda es cómo puedo crear una sesion de usuario "personalizada".

En mi aplicación, solo hay entidades para la consulta de datos. Por tanto, no existen usuarios. A partir del id card obtenido, debo comprobar que existe en la base de datos (solo consulta). Si existe, crear sesión con los datos obtenidos. Si no, volver a login.

Solo existe un tipo de usuario, debe estar activo mientras dure la sesión o la cierre. ¿Me podrían orientar en esto?

Gracias.


Respuestas

#1

Para no complicar las cosas demasiado, yo sí que utilizaría usuarios normales de Symfony y las sesiones y la seguridad estándar. Ten en cuenta que un usuario en Symfony no tiene que ser una entidad y por supuesto no hace falta que se guarde en la base de datos.

En Symfony, un usuario es una clase que implementa la interfaz UserInterface. Así que sólo tienes que implementar los cinco métodos obligatorios (getRoles(), getPassword(), getSalt(), getUsername(), eraseCredentials()) como te sea más cómodo para tu aplicación. Por ejemplo getRoles() puede devolver lo mismo para todos los usuarios, getPassword() y getSalt() pueden devolver null. getUsername() puede devolver el ID de la tarjeta y eraseCredentials() lo puedes dejar vacío.

Al margen de eso, en la clase que representa a los usuarios puedes añadir tantos métodos propios como necesites y con toda la lógica que te haga falta en tu aplicación.

@javiereguiluz

21 octubre 2015, 21:50
#2

Gracias.

Debo crear una clase (no entidad) (Se puede como servicio), y implementar UserInterface con los metodos obligatorios.

Al hacer login con la tarjeta compruebo id de la tarjeta, si es correcto, creo un objeto (UserInterface) y le asignos los valores que requiero.

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
....
 
// Creo al usuario si existe id tarjeta
$user = ...;
 
$firewall = 'secured_area';
$token = new UsernamePasswordToken($user, null, $firewall, array('ROLE_USER'));
$this->get("security.context")->setToken($token);
 
$request = $this->get("request");
$event = new InteractiveLoginEvent($request, $token);
$this->get("event_dispatcher")->dispatch("security.interactive_login", $event);

Lo anterior todavia tengo la duda, de cómo iniciar la session de usuario, ¿estará correcto lo anterior? Y después lo puedo llamar asi.

$user =  $this->get('security.context')->getToken()->getUser();

o

$user =  $this->getUser();

@dariongg

21 octubre 2015, 22:26
#3

Consulta para implementar UserInterface, ¿tengo que implementar todos los atributos y además los metodos obligatorios?

Para implementar este metodo setUsername(), ¿con esto es suficiente?

private $username;
 
public function setUsername($username)
{
   $this->username = $username;
}
 
public function getUsername()
{
   return $this->username;
}

@dariongg

21 octubre 2015, 23:39
#4

Buenas, con respecto a este punto:

A partir del id card obtenido, debo comprobar que existe en la base de datos (solo consulta). Si existe, crear sesión con los datos obtenidos.

¿Cómo haces para leer ese "id card", JavaScript? ¿alguna herramienta como Java? Porque si es con JavaScript por ejemplo, al leer el id, puedes enviarlo al servidor y creandote un Simple Autenticador puedes hacer que se cree la sesión del usuario en la aplicación.

Con respecto a la pregunta:

¿tengo que implementar todos los atributos y ademas los metodos obligatorios?

Las interfaces solo obligan a implementar métodos más no atributos, y la Interfaz UserInterface solo te obliga a implementar cinco métodos (getRoles(), getPassword(), getSalt(), getUsername(), eraseCredentials()).

Más info:

Saludos!

@manuel_j555

22 octubre 2015, 0:23
#5

Gracias.

El lector de tarjeta funciona como un teclado, es decir, al pasar la tarjeta sobre el lector escribe en este caso en un cuadro de texto el código de la tarjeta y ejecuta un <enter>. Solo tengo que crear cuadro de texto para recibir la id de la tarjeta y sola envía el formulario (login).

Lo que tenía pendiente era como crear un sesión de usuario con datos obtenidos de la base de datos que se encuentra en otro servidor. Sin crear un entidad usuario y así obtener la información recolecta de los bds para realizar las consultas pertinentes y además controlar el tiempo de conexión.

Mi duda está bien lo escrito en el #2, donde se crear un token de usuario para loguearlo y crear la sesión.

@dariongg

22 octubre 2015, 3:28