Newsgroup: it.comp.www.php
Titolo: Unicività di sessione

Problema:
Non voglio che una persona sia loggata contemporaneamente da due computer,
con la stessa login.
Come si può fare?
Ho cercato di inventarle di tutti i colori ma non funziona
Ciao, Matteo

Ciao, Matteo
Ciao, anch'io.


Una soluzione potrebbe essere vincolarlo a tenersi un cookie, ma come tutte
le soluzioni che mi vengono in mente si può scavalcare..
LAMASE


Ah, ovviamente dovresti controllare che l'utente che sta facendo il login
non sia già loggato =)
LAMASE

 wrote in message
news:afps7f$4d6$1...@newsreader.mailgate.org...

check.php (reindirizza se sessionid e IP non sono uguali a quello salvato in
un db o in un file):
<?
session_start();
$sid=session_id();
loadUni($utente, &reg_sid, &$reg_ip);
if (($sid != $reg_sid)||($_SERVER["REMOTE_ADDR"]))
{
    header("location: 
http://www.tuodominio.com/login.php
");
    exit;
}
?>
login.php:
<?
    session_start();
    $sid=session_id();
    // check login
    [...]
    if ($loginOK)  {
        saveUni($utente,$sid,$_SERVER["REMOTE_ADDR"]);
    }
?>
saveUni e loadUni, gestiscono i dati per un utente in un database o in un
file.
Se l'utente riesce ad avere un identico REMOTE_ADDR (ad esempio da una LAN
interna) potrebbe non funzionare. Ma e' molto improbabile.
Problema se l'utente ha un IP dinamico e la connessione si interrompe.

 if (($sid != $reg_sid)||($_SERVER["REMOTE_ADDR"]))
naturalmente deve essere:
    if (($sid != $reg_sid)||($_SERVER["REMOTE_ADDR"] != $reg_ip))

Se usi già un database, crea una tabella degli utenti attivi, e ogni
volta che un utente si logga tu scrivi in quella tabella che quel tale
utente è attivo, quando si slogga (o dopo un certo tempo) cancelli la
riga.
E ovviamente ogni richiesta di login controlli che lo user non sia già
loggato.
Ciao
Cla


Nel mio algoritmo si deve considerare l'IP dinamico, ma anche fosse statico,
il problema è quando al primo utente cade la connessione. Come si fa a far
capire che un altro ora può loggarsi?
Matteo

 capire che un altro ora può loggarsi?
Nel modo indicato puoi sempre loggarti senza problemi. Ma se lo fai da due
postazioni diversi fai scadere la sessione di quello prima (ed appare la
pagina del login). Funziona chiaramente solo se l'utente dovrebbe essere uno
solo (non la condivisione di un account).

capire che un altro ora può loggarsi?
Fai ricaricare ogni 5 secondi al browser, in un frame nascosto, il file
keepalive.php, che si limita a settare la variabile $LastSeen a time().
Se time() - $LastSeen diventa > 10 secondi, la connessione e' caduta, o
la sessione e' terminata, o l'utente ha chiuso il browser.
Certo, il server 'un gode.
Leonardo
-- 
Time's angles, mages tell, conceal a place
incredible, beyond the mundane mind;
night-shrouded and between the seas of space
dread creatures drift in the ageless winds.

 ha scritto nel messaggio
news:afps7f$4d6$1...@newsreader.mailgate.org...

Crei una tabella "sessioni" con username, datetime, id_Sessione.
Quando uno si logga, controlli che non sia già presente in questa tabella.
(se utilizzi un database) - Se username è unique, non c'e' bisogno che
controlli, ti fallisce direttamente la insert.
Se non è presente gli generi un id_sessione casuale, metti now() nel
datetime e il nome dell'utente in username.
(se utilizzi un database) id_sessione deve essere unique per non far
accadere che esistano due id_sessioni uguali.
Già così ti garantisci di non avere sessioni dupicate e di non avere due
utenti uguali.
usando le sessioni, ti salvi id_Sessione in una variabile di sessione.
In ogni script php, la prima cosa che devi fare è :
session_start()
cancelli le sessioni piu vecchie di X minuti  dalla tabella dele sessioni.
Controlli se l'id_sessione passato nella variabile esiste ancora nella
tabella,
se esiste ancora l'id_Sessione, aggiorni il datetime a now().
e ti kukki il nome dell'utente.
Se l'id_sessione non c'è più,  lo sbatti fuori a calci nel cu.
La comodità di questo metodo è che la tabella con dentro le sessioni rimane
sempre abbastanza pulita.
Ogni script che gli utenti eseguono, cancella le sessioni scadute.
Si potrebbe aggiungere qualche finezza come il campo tipo_Sessione nella
tabella sessioni
e un'altra tabella contenete
i tipi_sessione, un'eventuale descrizione, e il tempo di vita in secondi di
quel tipo di  sessione (il famoso X minuti).
Cordialmente.
Carmelo Carchedi.