CodeIgniter User Guide Version 1.6.1


Clase de Sesión

La clase de Sesión le permite mantener el "estado" de un usuario y seguir su actividad mientras navegue su sitio. La clase de Sesión guarda información de sesión para cada usuario como datos serializados (y opcionalmente encriptados) en una cookie. También guarda los datos de sesión en una tabla de base de datos para seguridad agregada, ya que permite qle el ID de la sesión en la cookie del usuario sea contrastada contra la guardada. Por defecto sólo la cookie es guardada. Si elije usar la opción de base de datos, necesitará crear la table de sesión como se indica debajo.

Nota: La clase de Sesión no utiliza las sesiones nativas de PHP. Genera sus propios datos de sesión, ofreciendo más flexibilidad para los desarrolladores.

Inicializando una Sesión

Las sesiones típicamente correrán globalmente con cada carga de la página, así que la clase de sesión debe ser o inizializada en el constructor de su controlador, o puede ser auto-cargada por el sistema. Para la mayor parte, la clase de sesión correrá desatendida en el transfondo, así que simplemente inicializar la clase causará leer, crear y actualizar sesiones.

Para inicializar la clase de Sesión manualmente en el constructor del controlador, use la función $this->load->library:

$this->load->library('session');

Una vez cargada, el objeto de la librería de Sesión estará disponible usando: $this->session

¿Cómo funcionan las sesiones?

Cuando una página es cargada, la clase de sesión verificará si datos de sesión válidos existen en la cookie de sesión del cliente. Si los datos de sesión no existen (o si ha expirado) una nueva sesión será creada y guardada en la cookie. Si una sesión existe, su información será actualizada y la cookie será actualizada. Con cada actualización, el session_id (identificador de sesión) será regenerado.

Es importante para usted entender que una vez inicializada, la clase de Sesión corre automáticamente. No hay nada que necesite hacer para que el comportamiento anterior ocurre. Puede, como verá luego, trabajar con datos de sesión o incluso agregar sus propios datos a la sesión del usuario, pero el proceso de lectura, escritura y actualización de sesión es automático.

Que son los Datos de Sesión?

Una sesión, hasta donde le concierne a CodeIgniter, es simplemente un arreglo conteniendo la siguiente información:

Los datos anteriores son guardados en una cookie como un arreglo serializado con este prototipo:

[array]
(
     'session_id'    => encriptación aleatoria,
     'ip_address'    => 'cadena - dirección IP del usuario',
     'user_agent'    => 'cadena - datos del agente del usuario',
     'last_activity' => marca de tiempo
)

Si tiene la opción de encriptación habilitada, el arreglo será encriptado antes de ser guardado en la cookie, haciendo los datos altamente seguros e impermeables de ser leídos o alterados por alguien. Más información acerca de la encriptación puede ser encontrada aquí, aunque la clase de Sesión se ocupará de la inicialización y encriptación de datos automáticamente.

Nota: Las cookies de sesión son sólo actualizadas cada cinco minutos por defecto para reducir la carga de procesamiento. Si recarga repetidamente una página, notará que el tiempo de "last activity" sólo se actualizará si cinco munitos o más han pasado desde la última vez que la cookie fue escrita. Este tiempo es configurable cambiando la línea de $config['time_to_update'] en su archivo system/config/config.php .

Recuperando Datos de Sesión

Cualquier pieza de información desde el arreglo de sesión está disponible usando la siguiente función:

$this->session->userdata('item');

Donde item es la clave del arreglo correspondiente al item que desea traer. Por ejemplo, para traer el ID de sesión hará lo siguiente:

$session_id = $this->session->userdata('session_id');

Nota: La función devuelve FALSE (booleano) si el item al que intenta acceder no existe.

Agregando Datos de Sesión Especiales

Un aspecto útil del arreglo de sesión es que puede agregar sus propios datos a él y ellos serán guardados en la cookie del usuario. ¿Por qué querría hacer esto? Aquí hay un ejemplo:

Digamos que un usuario en particular ingresó a su sitio. Una vez autenticado, puede agregar su nombre de usuario y dirección de email a la cookie de sesión, haciendo ese dato globalmente disponible sin tener que correr una consulta de base de datos cuando lo necesite.

Para agregar sus datos al arreglo de sesión debe pasar un arreglo que contenga sus nuevos datos a esta función:

$this->session->set_userdata($arreglo);

Donde $arreglo es un arreglo asociativo conteniendo sus nuevos datos. Aquí hay un ejemplo:

$nuevosdatos = array(
                   'nombre_de_usuario'  => 'johndoe',
                   'email'     => 'johndoe@algun-sitio.com',
                   'ingresado' => TRUE
               );

$this->session->set_userdata($nuevosdatos);

Si quiere agregar un dato a la vez, set_userdata() también soporta esta sintaxis.

$this->session->set_userdata('algun_nombre', 'algun_valor');

Nota: Las cookies pueden guardar sólo 4KB de datos, así que sea cuidadoso de no exceder la capacidad. La El proceso de encriptación en particular produce una cadena de datos más largo que la original, así que sea cuidadoso siguiente cuanto datos están guardando.

Removiendo Datos de Sesión

Simplemente como set_userdata() puede ser usado para agregar información en la sesión, unset_userdata() puede ser usado para remover, al pasar la clase de sesión. Por ejemplo, si quiere remover 'algun_nombre' de la información de sesión:

$this->session->unset_userdata('algun_nombre');

Esta función puede también puede recibir un arreglo asociativo de items para borrar.

$arreglo_items = array('nombre_de_usuario' => '', 'email' => '');

$this->session->unset_userdata($arreglo_items);

Flashdata

CodeIgniter soporta "flashdata", o datos de sesión que sólo estarán disponibles para el próximo pedido al servidor. Esto puede ser muy útil, y son típicamente usados para informar o mensajes de estado (por ejemplo: "registro 2 borrado").

Nota: Las variables flash son prefijadas con "flash_" así que evite esos prefijos en sus propios nombres de sesión.

Para agregar flashdata:

$this->session->set_flashdata('item', 'valor');

También puede pasar un arreglo a set_flashdata(), de la misma manera que con set_userdata().

Para leer una variable flashdata:

$this->session->flashdata('item');

Si encuentra que necesita preservar una variable flashdata durante un pedido adicional, puede hacerlo usando la función keep_flashdata().

$this->session->keep_flashdata('item');

Guardando Datos de Sesión en la Base de Datos

Mientras el arreglo de datos de sesión guardada en la cookie del usuario contenga un identificador de sesión, a menos que guarde los datos de sesión en una base de datos, no hay forma de validarlo. Para algunas aplicaciones que requieren poco o nada de seguridad, la validación del ID de sesión puede no ser necesaria, pero si la aplicación requiere seguridad, la validación es obligatoria.

Cuando los datos de sesión están disponibles en una base de datos, cada vez que una sesión válida es encontrada en la cookie del usuario, una consulta a la base de datos es hecha para compararla. Si el identificador de sesión no coincide, la sesión es destruida. Los identificadores de sesión nunca pueden ser actualizados, sólo pueden ser generados cuando se crea una nueva sesión.

Para guardar sesiones, debe crear una tabla de base de datos primero. Aquí está el prototipo básico (para MySQL) requerido por la clase de sesión:

Nota: Por defecto, la tabla es llamada ci_sessions, pero puede nombrarla como desee siempre y cuando actualice el archivo application/config/config.php para que contenga el nombre que ha elegido. Una vez que haya creado su tabla de base de datos puede habilitar la opción de base de datos en su archivo config.php como sigue:

$config['sess_use_database'] = TRUE;

Una vez habilitada, la clase de Sesión guardará datos de sesión en la base de datos.

Esté seguro que haya especificado el nombre de la tabla en su archivo de configuración también:

$config['sess_table_name'] = 'ci_sessions";

Nota: La clase de Sesión tiene un recolector de basura incluido que limpia las sesiones expiradas para que usted no necesito escribir su propia rutina para hacerlo.

Destruir una sesión

Para limpiar la sesión actual:

$this->session->sess_destroy();

Preferencias de Sesión

Encontrará las siguientes preferencias relacionadas a la Sesión en su archivo application/config/config.php:

Preferencia Por defecto Opciones Descripción
sess_cookie_name ci_session Ninguna El nombre que quiere que la cookie de sesión sea guardada.
sess_expiration 7200 Ninugna El número de segundos que quiere que dure la sesión. El valor por defecto es de 2 horas (7200 segundos). Si quiere una sesión que no expire establezca el valor a cero: 0
sess_encrypt_cookie FALSE TRUE/FALSE (buleano) Si encriptar o no los datos de sesión.
sess_use_database FALSE TRUE/FALSE (buleano) Si guardar los datos de sesión a una base de datos. Debe crear la tabla antes de habilitar esta opción.
sess_table_name ci_sessions Cualquier nombre de tabla válido en SQL El nombre de la tabla de sesión en la base de datos.
sess_time_to_update 300 Tiempo en segundos Estas opciones controlan cuan a menudo la clase de sesión se regenerará y creará un nuevo identificador de sesión.
sess_match_ip FALSE TRUE/FALSE (buleano) Si coincide la dirección de IP del usuario cuando se lean los datos de sesión. Note que algunos proveedores de servicio de Internet (ISPs) cambian dinámicamente el IP, así que si quiere una sesión que no expire deberá establecerlo en FALSE.
sess_match_useragent TRUE TRUE/FALSE (buleano) Si coincide el Agente del Usuario cuando se leen los datos de sesión.