Pregunta

Al crear una aplicación web, y digamos que tiene un objeto Usuario que indica un solo usuario, ¿cuál cree que es la mejor manera de almacenar que el usuario ha iniciado sesión?

Dos formas en las que he pensado han sido:

  • Almacenó la identificación de la base de datos del usuario en una variable de sesión
  • Almacenó todo el objeto de usuario en una variable de sesión

¿Alguna sugerencia mejor, algún problema con el uso de las formas anteriores?Quizás problemas de seguridad o problemas de memoria, etc, etc.

¿Fue útil?

Solución

Recomiendo almacenar la identificación en lugar del objeto.La desventaja es que tienes que acceder a la base de datos cada vez que quieras obtener la información de ese usuario.Sin embargo, a menos que cada milisegundo cuente en su página, el rendimiento no debería ser un problema.Aquí hay dos ventajas:

  1. Si la información del usuario cambia de alguna manera, entonces no almacenará información desactualizada en su sesión.Por ejemplo, si un administrador otorga privilegios adicionales a un usuario, estos estarán disponibles inmediatamente sin que el usuario tenga que cerrar sesión y luego volver a iniciarla.

  2. Si la información de su sesión se almacena en el disco duro, solo podrá almacenar datos serializables.Entonces, si su objeto Usuario alguna vez contiene algo como una conexión de base de datos, un socket abierto, un descriptor de archivo, etc., esto no se almacenará correctamente y es posible que tampoco se limpie adecuadamente.

En la mayoría de los casos, estas preocupaciones no serán un problema y cualquiera de los dos enfoques estaría bien.

Otros consejos

Por razones de seguridad, generaría (ya sea un GUID o un RNG criptográficamente seguro) una ID de sesión y tendría una tabla que simplemente asigna las ID de sesión a las ID de usuario.Luego, simplemente almacena el ID de la sesión en sus cookies y hace que actúe como un proxy para el ID del usuario.

|Session |UserID |
|--------+-------|
|a1d4e...+ 12345 |
|--------+-------|
|c64b2...+ 23456 |
|--------+-------|

Con esto nadie podrá hacerse pasar por otro usuario adivinando su ID.También permite limitar las sesiones de los usuarios para que tengan que iniciar sesión cada cierto tiempo (dos semanas es lo habitual).Y si desea almacenar otros datos sobre su sesión, puede simplemente agregarlos a esta tabla.

Sólo recuerde que si almacena todos los atributos del usuario (esto se extiende a los permisos) en la sesión, cualquier cambio en el usuario no tendrá efecto hasta que inicie sesión nuevamente.

Personalmente, guardo el nombre y la identificación para referencia rápida y busco el resto cuando lo necesito.

Guardar la identificación es la mejor práctica en la mayoría de los casos.Una razón importante para esto es la escalabilidad.Si almacena el objeto de usuario (o cualquier entidad de la base de datos, en lugar de solo sus ID), tendrá problemas para expandir la cantidad de servidores que atienden su sitio.Para obtener más información, busque en Google "arquitectura de nada compartido".

Creo que depende de la plataforma que estés usando.Si está utilizando ASP.net, definitivamente le echaría un vistazo a Autenticación de formularios class y todas las funciones integradas (y ampliables) que puede utilizar para almacenar la configuración del usuario que ha iniciado sesión.

Almacenaría un valor hash de la identificación del usuario y la identificación de la sesión y luego lo compararía en una tabla de sesiones en la base de datos.De esa forma será más difícil falsificar los datos de la sesión.¿Puedo verificar la IP también como verificación adicional?

No estoy seguro de querer confiar en que un ID de usuario se almacene en una variable de sesión y confiar en que era ese usuario, ya que podría modificarse con bastante facilidad y obtener acceso como otro miembro.

Normalmente almaceno al usuario en la sesión.El problema de no poder cambiar hasta iniciar sesión se puede resolver reemplazando el objeto en la sesión con una nueva copia después de haber realizado cambios.

Nuestro objeto de usuario es bastante liviano, por lo que optamos por almacenarlo en una variable de sesión.No estoy seguro de si eso es más eficiente, pero hasta ahora está funcionando muy bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top