PHP Native Sessions en CodeIgniter


Hace poco realicé un proyecto que consistía en un pequeño sistema, el cual  consistía en un sistema de control de usuarios:
Se crea un usuario con un nombre y contraseña y se le da acceso a cierto material de la empresa.

Por la naturaleza del proyecto utilicé CodeIgniter, solo que en este caso, el contenido (las paginas html que el usuario podia ver), no se encontraba en las vistas, ya que alguien  ajeno al equipo de trabajo se encargaba de generar los html’s y existía una proyección a futuro de que dejar los html’s clavados en vistas causaría problemas mas adelante.

Ahora el problema era como validaría si un usuario podía ver el contenido (estaba loggeado/tenia el permiso) que no se encontraba dentro del proyecto de CodeIgniter, ya que la sesion solo funciona para lo que se encuentra dentro del proyecto.

Primero que nada, tendría que obtener todos las urls de los contenidos (html’s) a los que tenía acceso el usuario y guardarlos en mi sesión de CI para después cuando el usuario intentara ver un contenido, se ejecutara un script que validaba la sesion de CI.

function validAccess(){

	//Buscamos sesion de CI
	$cisess_cookie = $_COOKIE['ci_session'];
        $cisess_cookie = stripslashes($cisess_cookie);
	$cisess_cookie = unserialize($cisess_cookie);

	if(isset($cisess_cookie['is_logged_in']))
		$loggedIn = $cisess_cookie['is_logged_in'];
	else
		$loggedIn = FALSE;

	if(!$loggedIn){
		die('Acceso restringido, haga login para acceder a esta página');
	}

	//checamos que este en los sitios permitidos para el usuario
	$sitios = $cisess_cookie['sitiosPermitidos'];
	$currentUrl= currentUrl();

	$flag=false;
	if(is_array($sitios)){
		foreach ($sitios as $s){
		 if($s==$currentUrl){$flag=true;}
		}
	}

	if(!$flag){die('Acceso restringido');}

}

function currentUrl(){
	$actual_link = 'http://'.$_SERVER['HTTP_HOST']. $_SERVER['REQUEST_URI'];
	return $actual_link;
}

El html con el contenido tenía que incluir este script para validar que el usuario estuviera en sesión, de lo contrario solo se mostraba el mensaje de error.

El problema surgió cuando la lista de contenidos (url’s) a los que el usuario tenía acceso aumento, ya que como dice la documentación de CodeIgniter, los datos de sesión no deben exceder los 4KB; y en la sesión además de los datos por default llegaba a guardar un listado de mas de 20 urls, entonces cuando quería loggear al usuario, la sesión nunca se guardaba.

Como muchos saben, CI no utiliza las sesiones nativas de PHP, sino las cookies y generar una cookie es un poco mas complejo, por lo cual decidí utilizar las sesiones nativas de PHP. Ahora, CI no acepta que se invoque directamente las funciones de sesión nativa, por lo que tuve que crear una librería, a la cual llamé nativesession.php

class Nativesession{

    public function __construct(){
        session_start();
    }

    public function set( $key, $value ){
        $_SESSION[$key] = $value;
    }

    public function get( $key ){
        return isset( $_SESSION[$key] ) ? $_SESSION[$key] : null;
    }

    public function regenerateId( $delOld = false ){
        session_regenerate_id( $delOld );
    }

    public function delete( $key ){
        unset( $_SESSION[$key] );
    }
}

La librería la utilicé de la siguiente manera:
Después de validar que los datos de loggeo son correctos se hace lo siguiente

$this->load->library( 'nativesession' );
$this->nativesession->set('MIS_SITIOS', $this->getSitios($user->id));

Finalmente, en mi archivo de seguridad modifiqué algunas líneas:

function validAccess(){

	//Buscamos sesion de CI
	$cisess_cookie = $_COOKIE['ci_session'];
	$cisess_cookie = stripslashes($cisess_cookie);
	$cisess_cookie = unserialize($cisess_cookie);
	/*
		utilizamos el metodo session_start para poder acceder a la variable
		de sesion que contiene el arreglo de sitios a los que puede acceder
		el usuario.
	*/
	session_start();

	if(isset($cisess_cookie['is_logged_in']){
		$loggedIn = TRUE;
	}

	$url = $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];

	if(!$loggedIn){
		die('Acceso restringido, haga login para acceder a esta página');
	}

	//checamos que este en los sitios permitidos para el usuario
	$sitios = $_SESSION['MIS_SITIOS'];
	$currentUrl= currentUrl();

	$flag=false;
	if(is_array($sitios)){
		foreach ($sitios as $s){
			if($s==$currentUrl){
				$flag=true;
			}
		}
	}

	if(!$flag){
		die('Acceso restringido');
	}
}

Ahora después de haber hecho esta modificación en el código, la lista de sitios permitidos a un usuario puede seguir creciendo sin tener que preocuparme por la cantidad de información que paso en variable de sesión.

Creditos a Steve Claridge:
http://www.moreofless.co.uk/using-native-php-sessions-with-codeigniter

Anuncios
Esta entrada fue publicada el 13 abril, 2013 a las 23:13. Se guardó como Tech y etiquetado como , , , , , . Añadir a marcadores el enlace permanente. Sigue todos los comentarios aquí gracias a la fuente RSS para esta entrada.

3 pensamientos en “PHP Native Sessions en CodeIgniter

  1. Muchas gracias por el dato, necesitaba usar las variables de sesión de otro sitio por que mi codigo codeigniter es un módulo integrado a un mal diseño anterior.
    Me sirvió mucho el codigo de Steve Claridge.

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

A %d blogueros les gusta esto: