2009-03-04 18 views
10

Tengo dos aplicaciones que estoy tratando de unificar. Uno fue escrito por mí y otro es un CMS que estoy usando. Mi autenticación ocurre en la que codifiqué y me gustaría que mi CMS supiera esa información. El problema es que el CMS usa un nombre de sesión y mi aplicación usa otro. No quiero que usen el mismo debido a posibles conflictos de espacio de nombres, pero aún me gustaría obtener esta información.¿Puedes cambiar las sesiones de PHP en una sesión?

¿Es posible cambiar los nombres de las sesiones en el medio de una solicitud? Por ejemplo, haciendo algo como esto en el CMS:

//session_start already called by cms by here 

$oldSession = session_name(); 
session_name("SESSION_NAME_OF_MY_APP"); 
session_start(); 

//get values needed 
session_name($oldSession); 
session_start(); 

¿Funcionaría algo así? No puedo encontrar nada en los documentos o en la web si algo así funcionaría después de haber llamado a session_start(). ¿Consejos?

Presentando esta solución, he estado considerando simplemente desarrollar un servicio web para obtener la información, pero obviamente obtenerla de la sesión sería preferible ya que esa información ya está disponible.

Gracias!

Respuesta

0

Debe usar session_id, puede usarlo para establecer/obtener la identificación de la sesión (o nombre).

Entonces, en lugar de usar session_name (en su pseudo código), use session_id.

1

session_regenerate _id()

El manual explica esta bastante bien, pero aquí hay algunos ejemplos del manual

session_start(); 

$old_sessionid = session_id(); 

session_regenerate_id(); 

$new_sessionid = session_id(); 

echo "Old Session: $old_sessionid<br />"; 
echo "New Session: $new_sessionid<br />"; 

print_r($_SESSION); 
+0

esto parece una buena apuesta ... ¡Lo intentaré! –

+3

-1: Esto solo cambia la identificación de la sesión, pero la sesión sigue siendo la misma. – hakre

0

Zend_Session ofrece espacios de nombre para las sesiones.

casos Zend_Session_Namespace son objetos de descriptor de acceso para rebanadas de espacios de nombres de $ _SESSION. El componente Zend_Session envuelve el PHP ext/sesión existente con una administración y una interfaz de gestión, así como proporcionar una API para Zend_Session_Namespace a persistir espacios de nombres de sesión. Zend_Session_Namespace proporciona una interfaz estandarizada, orientada a objetos para trabajar con espacios de nombres persistió dentro del mecanismo de sesión estándar de PHP. Existe compatibilidad para anónima y autenticada (por ejemplo, "inicio de sesión") espacios de nombres de sesión.

0

Es posible. Pero yo creo que hay que hacer lo mismo manejo de sesión:

session_name('foo'); 
// start first session 
session_start(); 

// … 

// close first session 
session_write_close(); 

session_name('bar'); 
// obtain session id for the second session 
if (ini_get('session.use_cookies') && isset($_COOKIE[session_name()])) { 
    session_id($_COOKIE[session_naem()]); 
} else if (ini_get('session.use_trans_sid') && !ini_get('session.use_only_cookies') && isset($_REQUEST[session_name()])) { 
    session_id($_REQUEST[session_naem()]); 
} 
// start second session 
session_start(); 

// … 

Pero tenga en cuenta que es posible hacer algunas de las otras cosas como el manejo de sesiones configuración de cookies también. No sé si PHP hace esto en este caso también.

3

Nota: la respuesta a continuación no es correcta, no la utilice ni vote.Lo dejé aquí como un lugar para discusión

Tu solución debería funcionar (no es que alguna vez haya intentado algo así), excepto que tienes que cerrar manualmente la sesión anterior antes de llamar a session_name() ya que de lo contrario silenciosamente fallar

Usted puede intentar algo como esto:

session_write_close(); 
$oldsession = session_name("MY_OTHER_APP_SESSION"); 
session_start(); 

$varIneed = $_SESSION['var-I-need']; 
session_write_close(); 
session_name($oldsession); 
session_start; 

No hay necesidad de meterse en realidad con el valor de ID de sesión, ya sea a través de rutinas de manipulación de PHP de identificación de sesión o mediante mutilación de galletas Manual - PHP se hará cargo de todo lo que sí mismo y no deberías meterse con eso.

+1

Me parece que puede terminar con dos nombres de sesión diferentes que tienen la misma identificación. Si eso sucede, ambas sesiones comparten los mismos datos, incluso si tienen diferentes nombres. Para evitar eso, es posible que desee meterse con la identificación de la sesión después de todo ... – commonpike

+1

No veo cómo podría suceder eso, a menos que suponga que dos clientes diferentes también pueden obtener la misma ID de sesión "por error". Esto se debe a que la forma en que session_name() funciona es que cambia qué cookie utiliza PHP para identificar la sesión, y si eso hace que generes una nueva sesión (en lugar de cargar una existente), PHP garantizará que está utilizando un nuevo ID de sesión: de lo contrario, será fácil secuestrar las sesiones. – Guss

+0

Además, jugar con la ID de la sesión es una forma segura de abrir agujeros para secuestradores de sesión. Si te metes con ID de sesión (no lo hagas), no asumas que sabes cómo generar ID de sesión y siempre usa 'session_regenerate_id()'. – Guss

6

Aquí es un ejemplo de trabajo cómo cambiar entre sesiones:

session_id('my1session'); 
session_start(); 
echo ini_get('session.name').'<br>'; 
echo '------------------------<br>'; 
$_SESSION['value'] = 'Hello world!'; 
echo session_id().'<br>'; 
echo $_SESSION['value'].'<br>'; 
session_write_close(); 
session_id('my2session'); 
session_start(); 
$_SESSION['value'] = 'Buy world!'; 
echo '------------------------<br>'; 
echo session_id().'<br>'; 
echo $_SESSION['value'].'<br>'; 
session_write_close(); 
session_id('my1session'); 
session_start(); 
echo '------------------------<br>'; 
echo $_SESSION['value']; 

Log se verá así:


PHPSESSID 
------------------------ 
my1session 
Hello world! 
------------------------ 
my2session 
Buy world! 
------------------------ 
Hello world!

Por lo tanto, como se puede ver, las variables de sesión guardada y restaurada, mientras que el cambio de sesión.

+3

No se meta con la ID de la sesión de forma manual: esto es lo que distingue a un usuario de otro. Si manipulas las identificaciones de sesión a mano, permites que ocurra el secuestro de la sesión, y eso, para los no iniciados, es ** malo **. – Guss

+0

En lugar de establecer manualmente session_id, puede llamar a 'session_regenerate_id()' (pero debe hacerlo después de la segunda 'session_start()'). Al hacer este cambio y eliminar ambas llamadas 'session_id()' de tu código, obtienes el mismo efecto sin interferir con los ID de sesión.Tenga en cuenta que esto no carga una sesión anterior: todos los datos presentes en la "segunda sesión" son idénticos a la primera sesión, simplemente evita que los datos nuevos se escriban en la sesión anterior. Parece un comienzo para construir su propio mecanismo para administrar sesiones intercambiables. – Guss

2

He estado trabajando en perfeccionar esto y esto es lo que he ideado. Paso a una sesión para padres usando nombres de sesión en las aplicaciones de mi hijo y luego a la sesión de mi aplicación hija. La solución crea la sesión principal si no existe.

$current_session_id = session_id(); 
$current_session_name = session_name(); 

session_write_close(); 

$parent_session_name = 'NameOfParentSession'; 

// Does parent session exist? 
if (isset($_COOKIE[$parent_session_name])) { 

    session_id($_COOKIE[$parent_session_name]); 
    session_name($parent_session_name); 
    session_start(); 

} else { 
    session_name($parent_session_name); 
    session_start(); 

    $success = session_regenerate_id(true); 
} 

$parent_session_id = session_id(); 

// Do some stuff with the parent $_SESSION 

// Switch back to app's session 
session_write_close(); 
session_id($current_session_id); 
session_name($current_session_name); 
session_start(); 
+0

¡Esto funcionó para mí! Volver a la sesión original es importante porque de lo contrario se ejecutará el código de manejo de la sesión mágica y las cosas se pondrán raras. –