2010-05-06 8 views
5

Aquí está el escenario:¿Cuáles son algunas maneras de identificar a un usuario conectado en la web?

Hay 5 sitios web (diferentes nombres de dominio) que necesitan compartir una sesión. Estoy usando un poco de código en cada sitio que devuelve una imagen "en blanco.gif" y al mismo tiempo establece la sesión (sincronizándola con la sesión actual). Cada uno de los sitios llama a una sesión-img de cada uno de los otros sitios. Además, todos los sitios tienen acceso a la misma base de datos (donde se almacena la sesión). Esto funciona muy bien en FF y Chrome, pero no en IE (o Safari PC) ...

¿Necesito encontrar un método alternativo para mantener activa una sesión? La aplicación es un pequeño CMS personalizado, por lo que solo 2-3 personas lo usarán.

es probable que pueda identificar los inicios de sesión de usuario por IP y luego continuar para comprobar la IP al otro lado de todos los sitios ...

¿Hay algo más granular como un UUID equipo que pueda comprobar para que?

+5

Si se trata de la misma sesión, ¿por qué no acaba de transferir el ID de sesión como un parámetro GET cuando el usuario se mueve de una página a otra? – Daff

+0

no, no hay nada como "un equipo uuid". –

+0

Daff, vamos a intentarlo, realmente solo necesito tener un parámetro en la URL cuando el usuario administrador está conectado ... – farinspace

Respuesta

1

Si se trata de la misma sesión, ¿por qué no que acaba de transferir el ID de sesión como un parámetro GET cuando el usuario se mueve desde una página a otra? - @Daff

@Daff, si se agrega su respuesta aquí, voy a modificar y seleccione como la respuesta

-2

Puede anular el manejador de sesión para que guarde los datos de la sesión en una base de datos compartida por sus diferentes sitios web. Luego, debe establecer una cookie de sesión con la misma ID de sesión en cada servidor. Habría que utilizar session_set_save_handler y hacer algo por el estilo:

/** 
* @desc function used to open sessions 
* @param string session path 
* @param string session id 
* @return bool 
*/ 
function xx_session_open($path, $id){ 
    return true; 
} 

/** 
* @desc used when closing a session 
* @return bool 
*/ 
function xx_session_close(){ 
    return true; 
} 

/** 
* @desc saves session data 
* @param string session id 
* @param string session data 
* @uses xx_crypt 
* @return bool 
* @global object PDO instance 
*/ 

function xx_session_write($id, $data){ 
    global $db; 
    $crypted = xx_crypt($data); 
    // Saves data into db 
    $sql = 'REPLACE INTO sessions (`ID`, `data`, `lastUsed`, `IV`) VALUES(:id, :data, NOW(), :iv)'; 
    $sth = $db->prepare($sql); 
    $sth->execute(array(':id'=>$id, ':data'=>$crypted[0], ':iv'=>$crypted[1])); 
    return true; 
} 

/** 
* @desc gets session data 
* @param string session ID 
* @return string 
* @global object PDO instance 
* @uses xx_decrypt 
*/ 
function xx_session_read($id){ 
    global $db; 
    $sql = 'SELECT `data`, `IV` FROM sessions WHERE `ID`=:id'; 
    $sth = $db->prepare($sql); 
    $sth->execute(array(':id'=>$id)); 
    list($crypted, $iv) = $sth->fetch(); 
    $data = xx_decrypt($crypted, $iv); 
    return $data; 
} 

/** 
* @desc destroys a session 
* @param string session ID 
* @return bool 
* @global object PDO instance 
*/ 
function xx_session_destroy($id){ 
    global $db; 
    $sql = 'DELETE FROM sessions WHERE `ID`=:id'; 
    $sth = $db->prepare($sql); 
    $sth->execute(array(':id'=>$id)); 
    return true; 
} 

/** 
* @desc delete old sessions 
* @param int session lifetime (in seconds) 
* @return bool 
* @global object PDO instance 
*/ 
function xx_session_gc($lifetime){ 
    global $db; 
    $sql = 'DELETE FROM sessions WHERE `lastUsed` < :limit'; 
    $sth = $db->prepare($sql); 
    $sth->execute(array(':limit'=>date('Y-m-d H:i:s',time() - $lifetime))); 
    return true; 
} 

// Set session handler 
session_set_save_handler("xx_session_open", "xx_session_close", "xx_session_read", "xx_session_write", "xx_session_destroy", "xx_session_gc"); 

Si lo que quieres es un inicio de sesión único mecanismo, se puede comprobar el protocolo Kerberos que está hecho para eso.

+0

esto es más o menos lo que estoy haciendo ... el problema que tengo es pasar la sesión a los nuevos dominios, estaba intentando un pase de imagen oculta para todos los sitios diferentes, pero no funciona en IE8 para ser exacto – farinspace

+0

Luego, el La forma más fácil de hacerlo es lo que ya está haciendo con su imagen: cada vez que genera una identificación de sesión, debe generar una página web que llame a otras secuencias de comandos de dominio con la identificación de sesión como parámetro para permitir que esas secuencias de comandos generen sus cookies de sesión con la ID correcto – Arkh

2

Cualquier cosa que haría esto posible sin la cooperación de los usuarios sería un error en cuanto a la privacidad del usuario y el anonimato que eventualmente se arreglaría. No se supone que los sitios web sean capaces de descubrir en qué otros sitios ha estado un usuario y qué ha hecho allí.

+1

¡Dilo a facebook! – Pierreten

+0

De hecho, dígaselo a cualquiera que use Google Analytics o AdSense o cualquier otro complemento integrado. – Arkh

Cuestiones relacionadas