Como puedo hacer magia con Cake? <Problema con Sessiones>

26 views
Skip to first unread message

Mouses

unread,
Jan 30, 2009, 1:28:48 AM1/30/09
to CakePHP en Español
Hola Gurus del Cake,

Quise consultarlos por que después de mucho leer y de intentos
fallidos no logro hacer que cake me responda como lo deseo, mi
problema es el siguiente me encuentro en la integración de una
herramienta desarrollada con Cakephp<Version 1.1> en un portal donde
no se usa Cake y maneja su propia sesión <la sesion por default de
PHP - PHPSESSID> lo que sucede es que en este portal los usuarios y
sus datos son registrados en la sesiones.

Lo que yo trato de hacer es que dependiendo del usuario que se ha
conectado al portal esta sea la conexión a la base de datos, dicho
usuario previamente recibirá privilegios de Grant para las tablas por
los que no puedo tener una conexión fija en el archivo "app/config/
Database.php" de cake lo que quiero hacer es mediante la sesión que se
inicia tomar los datos necesario de la conexión y hacer que cake
continué con la misma sesión, he leído mucha info de distintos lados y
me he topado soluciones para la versión de Cakephp 1.2 que no logran
funcionar correctamente en Cakephp 1.1 que es en el que se desarrollo
la aplicación; he logrado que en Database.php se inicie la sesión que
se inicio desde el portal así tomen los datos necesarios para la
conexión, haciendo lo siguiente:

<?php
session_start();

class DATABASE_CONFIG
{
var $default;

function DATABASE_CONFIG()
{
$default = array('driver' => 'mysql',
'connect' => 'mysql_connect',
'host' => $_SESSION['db_cake_server'],
'login' => $_SESSION['usuario'],
'password' => $_SESSION['pwd'],
'database' => $_SESSION['db_cake'],
'prefix' => '');
$this->default = $default;
}
}?>

Claro también modifique el core.php para indicarle a cake que usara la
sesión que ya se había iniciado desde el portal, de la seguiente
manera:

define('CAKE_SESSION_COOKIE', 'PHPSESSID');

Y esperaba que eso fuera mas que suficiente para tener éxito con la
integración, Pero....

Lo que ocurrió es que ahora el cake solo mantienen las variables de
sesión que se iniciaron desde el portal pero no es capaz de agregar
las variables de sesión que se generan en la aplicación de cake,
aparenta hacerlo pero no parece funciona como se espera, asi que la
sesión se comporta de forma estaña.

El problema es que la sesión llega ala aplicación de cake con 15
variables de sesión <Ejemplo> y una ves que la conexión se hizo de
forma exitosa; procedo a hacer algunos request a la base de datos para
obtener información que luego guardo a la sesión esperando que este
disponible para otro controlador o para las vistas del mismo
controlador de cake <en este punto tenemos 17 variables en la sesión o
eso muestra el print_r($_SESSION) .- Aunque en el archiv de la session
no escribio nada AQUI EL PROBLEMA!>, pero sucede que cuando cambio la
pagina estas variables que se suponen deberían estar en la sesión han
desaparecido <en este punto volvemos a tener solo 15 variables en la
sesiónlas mismas que se habían pasado desde el portal .- Esto claro
por que en el archivo de la sesion nunca se escribieron las nuevas
varibles>.

- Dato interesante es que las variables no se escriben en el archivo
de la sesión que se creo por el portal.

- Otro Dato de interés Cake no crea otro archivo de sesión para
guardar estas variables que yo trato de almacenar desde la
aplicacion,lo que aparenta es que cake si trata de usar la misma
sesión que ya tenia, pero por alguna este falla al escribirlas.

Ahora también trate de mantener las variables en un cookie y dejar la
configuración de la sesión la manejara cake para que funcionara
correctamente, pero resulta que si dejo que cake siga con su
configuración las cookies que yo declaro parece desaparecer cuando
estoy en el cake <Imprimo el arreglo de la cookie - print_r($_COOKIE);
> y no me muestra la cookie que declare solo muestra las cookies de
sesion que son las del portal y la del cake, por lo que este otro
intento tampoco me funciono.

Desesperado active las variables globales de PHP aun sabiendo que en
el portal estas no están permitidas<Pero vamos estoy haciendo esto
local, que mas da con tal que funcione> y resulta que cake no las ve o
no accede a las globales <esto si es raro>.

Resumen:

Problema .- Portal web con su propia sesión la cual trato de pasarla a
Cake por distintos métodos, parece no dar el resultado esperado y
causa funcionamientos erróneos con la sesión que se implementa en la
aplicación echa en cake.

Framework Cakephp.- Versión 1.1

*-*-*-*-*-*-*-*-*-*-*-*
Duda bonus, alguien podria decirme si seria posible pasarle de alguna
forma las variables a cake directo al archivo que inicializa el
Framework por POST y asi hacer que cake las guarde en su sesión para
que tan pronto se inicialice la conexión con la base de datos con el
Archivo de DataBase.php pueda usar esa variables que ya estarían en la
sesión del cake y asi dejar que cake siga con su propia sesion como lo
hace hasta ahora y funciona? y alguien sabe donde puedo localizar el
orden de la inicializacion del Cake o cual es el archivo que se
encarga de hacer esto ?

Estoy en un punto que no se me ocurren mas cosa para implementar y asi
tratar de solucionar mi problema.Espero alguno de la comunidad pueda
saber que estoy haciendo mal? o me pueda dar alguna idea de que mas
puedo tratar para solucionar este problema.

Les Agradezco a todos su Tiempo y los consejos que puedan brindarme,
espero que si logramos llegar a un solucion, esto le sea de ayuda a
mas personas.

Gracias Comunidad de Cakephp en español <Espero haber sido claro con
la explicacion>.
Message has been deleted

Mouses

unread,
Jan 30, 2009, 7:07:10 PM1/30/09
to CakePHP en Español
Y se hizo la LUZ !!!! < Nada como una noche de sueño y una lluvia de
ideas>,

Por fin logre hacer magia con el CAKE, esta si que fue una semana
interesante y aprendí muchas cosas, por ejemplo a mi problema he
logrado darle solucion después de mucho buscar, debbugear y un poco de
suerte, di con la solución a mi problema por mi cuenta =), la
proporciono al Grupo para el que lo llegue a necesitar sepa que hacer.

Lo primero es que Cake no solo tiene un archivo core.php son dos!!

--El PRIMERO es el que creo todos conocemos que se encuentra en "/cake/
app/config/core.php"
--El SEGUNDO el hermano gemelo malvado de mi historia esta en "/cake/
cake/scripts/template/skel/config/core.php"

Lo que no sabia es que de alguna forma ambas configuraciones están
relacionas durante la inicialización, por lo que las configuraciones
de la sesiones debe ser la mismas, tanto en nombre de la sesión como
en el nivel de Seguridad:

define('CAKE_SESSION_COOKIE', 'PHPSESSID');
define('CAKE_SECURITY', 'low');

Debe ser igual si no esto causara conflictos y causara que la sesión
se comporte de forma inesperada <la razón que se comporte de forma
inesperada es que te genera dos sesiones que poseen el mismo nombre
pero diferentes ID's>.

Como saber si esto te esta pasando!?!?!?!

1.- Limpia el navegador de sesiones y cookies,
2.- Imprime el arreglo con las variables de $_SERVER, si ves tu sesión
dos veces en el HTTP_COOKIE y con diferente ID, ya sabes como
resolverlo ;) ejemplo:

[HTTP_COOKIE] => PHPSESSID=192614432b2f59e6d243372fb59da955,
PHPSESSID=c2b4636b72803ce72dd1f9a84a6ec528

Pero aquí mi problema no se había resuelto por completo jejeje aunque
esto te permite tener una sesión valida para la ejecución del cake no
resuelve el problema si tu como yo tratas de hacer dinámica la
incializacion del Database.php con variables de sesion, como explique
anteriormente.

Que sucede es mi interpretación de la inicalización del CAKE primero
se crea la base de datos y después las sesiones y lo demás necesario
para la ejecución de tu aplicación, para agregar diversión cake
verifica si ya se inicio una sesión en el framework caso contrario el
lo hace por considerar que es la primera ves que se esta creando la
aplicación y debe darle sus valores a la sesión que se va a manejar,
en el caso que detecte que ya esta una sesión en ejecución ignora esto
y sigue con lo demás <Ahora esto funciona siempre y cuando no estés
iniciando una sesión en tu aplicación antes que cake lo haga, aquí mi
otro problema>

Como Resolver esto; en el archivo "/cake/cake/libs/session.php" en el
método"__initSession()" que es el que se encarga de iniciar la sesión
en base a las características del cake forzamos la inicializacion de
nuestra sesión para que todas las características sean puestas en
nuestra sesión que venimos manipulando desde antes,

Y Wolaa CAKE ya funciona como siempre y usando una conexión dinámica
con datos de una sesion inicializada previamente a su aplicación de
CAKE!

Seguro tendré errores o suposiciones incorrectas o incluso haya
sugerencias de optimizacion o consejos, todo esto es bien recibido

Saludos y Espero este largo post sea útil para los que lo lean!

Quien dice que NO se PUEDE!!!

Un agradecimiento a Gera por las ideas, Man si alguna ves lees esto
gracias por los consejos fueron una buena guía!

Joaquin Windmüller

unread,
Jan 30, 2009, 8:15:00 PM1/30/09
to cakep...@googlegroups.com
Felicitaciones! es un experimento interesante ;)

2009/1/30 Mouses <meg...@gmail.com>
Reply all
Reply to author
Forward
0 new messages