Verificare se un utente è connesso tramite db mysql

Discussione in 'PHP' iniziata da giannit, 26 Aprile 2017.

  1. giannit

    giannit Nuovo Utente

    Registrato:
    30 Marzo 2017
    Messaggi:
    31
    Mi Piace Ricevuti:
    2
    Punteggio:
    8
    Sesso:
    Maschio
    Ciao, rieccomi a scocciare con le mie domande, ho creato un db mysql per registrare degli utenti a cui viene permesso l'accesso a determinate pagine, ma mi sono accorto che se ad esempio, apro una sessione dal pc di casa e subito dopo apro una nuova sessione dal celluare, quindi con altro ip ma con stesse credenziali di accesso, riesco tranquillamente ad avere due sessioni aperte in contemporanea. Dalla lettura di vari post in rete oltre che su questo forum, da quello che ho capito dovrei creare una colonna sul db nella tabella loginattemps e questo non è un problema, ma qui mi blocco. La mia domanda è: Una volta creata la tabella, come faccio a farla funzionare?
    Questa e la struttura della tabella:

    Codice:
    CREATE TABLE `members` (
      `id` char(23) NOT NULL,
      `username` varchar(65) NOT NULL DEFAULT '',
      `password` varchar(65) NOT NULL DEFAULT '',
      `email` varchar(65) NOT NULL,
      `verified` tinyint(1) NOT NULL DEFAULT '0',
      `mod_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`),
      UNIQUE KEY `username_UNIQUE` (`username`),
      UNIQUE KEY `id_UNIQUE` (`id`),
      UNIQUE KEY `email_UNIQUE` (`email`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    CREATE TABLE `loginAttempts` (
      `IP` varchar(20) NOT NULL,
      `Attempts` int(11) NOT NULL,
      `LastLogin` datetime NOT NULL,
      `Username` varchar(65) DEFAULT NULL,
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Questa e la struttura del file per il login:
    PHP:
    <?php
    session_start
    ();
    if (!isset(
    $_SESSION['username'])) {
        
    header("location:login/main_login.php");
    }
    ed infine il file di controllo login

    PHP:
    <?php
    //'true' triggers login success
    ob_start();
    include 
    'config.php';
    require 
    'includes/functions.php';

    // Define $myusername and $mypassword
    $username $_POST['myusername'];
    $password $_POST['mypassword'];

    // To protect MySQL injection
    $username stripslashes($username);
    $password stripslashes($password);

    $response '';
    $loginCtl = new LoginForm;
    $conf = new GlobalConf;
    $lastAttempt checkAttempts($username);
    $max_attempts $conf->max_attempts;


    //First Attempt
    if ($lastAttempt['lastlogin'] == '') {

        
    $lastlogin 'never';
        
    $loginCtl->insertAttempt($username);
        
    $response $loginCtl->checkLogin($username$password);

    } elseif (
    $lastAttempt['attempts'] >= $max_attempts) {

        
    //Exceeded max attempts
        
    $loginCtl->updateAttempts($username);
        
    $response $loginCtl->checkLogin($username$password);

    } else {

        
    $response $loginCtl->checkLogin($username$password);

    };

    if (
    $lastAttempt['attempts'] < $max_attempts && $response != 'true') {

        
    $loginCtl->updateAttempts($username);
        
    $resp = new RespObj($username$response);
        
    $jsonResp json_encode($resp);
        echo 
    $jsonResp;

    } else {

        
    $resp = new RespObj($username$response);
        
    $jsonResp json_encode($resp);
        echo 
    $jsonResp;

    }

    unset(
    $resp$jsonResp);
    ob_end_flush();
     
    Ultima modifica di un moderatore: 27 Aprile 2017
  2. xone

    xone Utente Attivo

    Registrato:
    4 Aprile 2014
    Messaggi:
    179
    Mi Piace Ricevuti:
    13
    Punteggio:
    18
    Sesso:
    Maschio
    Occupazione:
    Consulente Seo & Digital Marketing
    Località:
    Salento
    Home Page:
    Ciao, potresti anche creare al login una sessione chiamata con lo stesso nome dell'username, e poi fare un controllo con un if se quella sessione esiste blocchi, se non esiste procedi.
     
  3. giannit

    giannit Nuovo Utente

    Registrato:
    30 Marzo 2017
    Messaggi:
    31
    Mi Piace Ricevuti:
    2
    Punteggio:
    8
    Sesso:
    Maschio
    Grazie della risposta, sinceramente sono molto confuso a forza di leggere. Il mio obiettivo finale e quello di impedire in qualche modo, che ci si possa loggare contemporaneamente con la stessa user e password da due diversi dispositivi. In pratica, dato il tipo di sito che ho realizzato, non vorrei trovarmi con 10 utenti in possesso di dati di accesso e 20 persone online, come sembra stia accadendo.
     
  4. xone

    xone Utente Attivo

    Registrato:
    4 Aprile 2014
    Messaggi:
    179
    Mi Piace Ricevuti:
    13
    Punteggio:
    18
    Sesso:
    Maschio
    Occupazione:
    Consulente Seo & Digital Marketing
    Località:
    Salento
    Home Page:
    Ma a te serve poter rilevare le persone online nel tuo sito? Altrmenti potresti creare una nuova tabella nel db (lastlogin) e memorizzare l'username che si è connesso, cosi al login oltre a verificare la correttezza di user e pass nella tabella "utenti" verifichi anche che l'username inserito nel form login non sia presente nella tabella "lastlogin". Provvederai a svuotare tale tabella quando l'utente fa il logout. Spero di essermi spiegato bene
     
  5. giannit

    giannit Nuovo Utente

    Registrato:
    30 Marzo 2017
    Messaggi:
    31
    Mi Piace Ricevuti:
    2
    Punteggio:
    8
    Sesso:
    Maschio
    Esatto, pensavo proprio di creare una tabella oppure aggiungere una colonna alla tabella "members" in cui che se l'utente è online, quando un altro tenta la connessione con lo stesso username, venga reindirizzato alla pagina di login o una pagina con un messaggio tipo: Utente già connesso.
     
  6. xone

    xone Utente Attivo

    Registrato:
    4 Aprile 2014
    Messaggi:
    179
    Mi Piace Ricevuti:
    13
    Punteggio:
    18
    Sesso:
    Maschio
    Occupazione:
    Consulente Seo & Digital Marketing
    Località:
    Salento
    Home Page:
    Conviene creare una tabella apposita e procedi in questo modo:
    1) Prelevi username e password dal form login;
    2) verifichi che user e pass siano corretti;
    3) se sono corretti fai un controllo nella tabella es. "logged" o "loggati" o "members" come preferisci;
    controlli con un if se l'user ricevuto dal form è presente nella tabella, se è presente reindirizzi a login.php se non è presente prosegui con l'area riservata.
    4) quando l'utente fa logout, elimini questo utente dalla tabella "members" in modo che si possa nuovamente loggare
     
    A bubino8 piace questo elemento.
  7. giannit

    giannit Nuovo Utente

    Registrato:
    30 Marzo 2017
    Messaggi:
    31
    Mi Piace Ricevuti:
    2
    Punteggio:
    8
    Sesso:
    Maschio
    Allora, aggiorno il post, ho trovato uno script di login che dovrebbe fare al caso mio, quando eseguo il login mi passa ad una pagina dove mi da come utente stato connesso tramite il timestamp. Se non cambio pagina, trascorso il tempo prestabilito mi riporta in stato disconnesso. Potrei sfruttare la funzione modificando leggermente, pensavo di mettere il tempo di connessione ad esempio 3 ore e se in questo frattempo non cambia lo stato, i tentativi di connessione con stesso user e password, dirottarli ad una pagina che avvisa che i dati sono gia in uso. Che dici, potrebbe funzionare?
     
  8. xone

    xone Utente Attivo

    Registrato:
    4 Aprile 2014
    Messaggi:
    179
    Mi Piace Ricevuti:
    13
    Punteggio:
    18
    Sesso:
    Maschio
    Occupazione:
    Consulente Seo & Digital Marketing
    Località:
    Salento
    Home Page:
    Potrebbe funzionare, ma se in quel tempo un utente si connette da un altro dispositivo avresti comunque una sessione doppia...
     
  9. bubino8

    bubino8 Utente Attivo

    Registrato:
    28 Aprile 2017
    Messaggi:
    318
    Mi Piace Ricevuti:
    18
    Punteggio:
    18
    Sesso:
    Maschio
    Località:
    BZ
    Mi unisco alla discussione, che è utile anche a me.
    Quindi nell'ipotetica tabella "logged" al login vado a fare i vari controlli e ad aggiungere con INSERT INTO la sessione con "nomeutente", mentre al logout vado a cancellare DELETE quella stessa riga? Corretto?

    Potrebbero oltre alla colonna "nomesessione" tornare utili altri campi come "IP" o altro o sarebbero campi inutili?

    Altro dubbio se dovessi avere la possibilità di accedere da due postazioni e mi dimenticassi di effettuare il logout, dovrei impostare che la sessione duri un massimo di (nr ore), o come si potrebbe fare?

    Grazie
     
    Ultima modifica: 28 Aprile 2017
  10. xone

    xone Utente Attivo

    Registrato:
    4 Aprile 2014
    Messaggi:
    179
    Mi Piace Ricevuti:
    13
    Punteggio:
    18
    Sesso:
    Maschio
    Occupazione:
    Consulente Seo & Digital Marketing
    Località:
    Salento
    Home Page:
    Memorizzare l'ip serve a poco perchè se ti logghi da casa col wifi e col cellulare in 3g avresti 2 ip differenti, mentre il controllo deve avvenire sull'username che è univoco. Potresti in quel caso memorizzare un timestamp del login e dopo tot di tempo effettuare il logout forzato con la rimozione del nomesessione.
     
  11. bubino8

    bubino8 Utente Attivo

    Registrato:
    28 Aprile 2017
    Messaggi:
    318
    Mi Piace Ricevuti:
    18
    Punteggio:
    18
    Sesso:
    Maschio
    Località:
    BZ
    Grazie adesso faccio qualche altra prova, però mi è saltato fuori un altro dubbio al' logout io ho
    HTML:
    <a href="home.php?logout"><i class="fa fa-sign-out"></i><span> Esci</span></a>
    come faccio eseguire la query DELETE al click su tag <a>?
     
  12. xone

    xone Utente Attivo

    Registrato:
    4 Aprile 2014
    Messaggi:
    179
    Mi Piace Ricevuti:
    13
    Punteggio:
    18
    Sesso:
    Maschio
    Occupazione:
    Consulente Seo & Digital Marketing
    Località:
    Salento
    Home Page:
    la query la puoi aggiungere prima della funzione del logout, immagino che al logout eliminerai le sessioni, quindi appena prima di rimuovere le sessioni fai la query svuoti la tabella e procedi al logout.
     
    A bubino8 piace questo elemento.
  13. bubino8

    bubino8 Utente Attivo

    Registrato:
    28 Aprile 2017
    Messaggi:
    318
    Mi Piace Ricevuti:
    18
    Punteggio:
    18
    Sesso:
    Maschio
    Località:
    BZ
    Hai pienamente ragione mio errore.
    Fatto e sembra faccia il suo dovere.

    Grazie ancora.
     
  14. xone

    xone Utente Attivo

    Registrato:
    4 Aprile 2014
    Messaggi:
    179
    Mi Piace Ricevuti:
    13
    Punteggio:
    18
    Sesso:
    Maschio
    Occupazione:
    Consulente Seo & Digital Marketing
    Località:
    Salento
    Home Page:
    Di niente, se ti va usa il tasto "Mi piace" sotto al mio commento =)
     
  15. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.549
    Mi Piace Ricevuti:
    126
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    Lombardia
    e se l'utente chiude "brutalmente" il browser senza fare l'operazione di logout che succede ?
     
  16. xone

    xone Utente Attivo

    Registrato:
    4 Aprile 2014
    Messaggi:
    179
    Mi Piace Ricevuti:
    13
    Punteggio:
    18
    Sesso:
    Maschio
    Occupazione:
    Consulente Seo & Digital Marketing
    Località:
    Salento
    Home Page:
    In quel caso allora oltre che registrare la sessione converrebbe usare un cookie e settare la sua scadenza:
    setcookie("nomecookie","valorecookie",time()+temposcadenza);
    O implementare un tempo di inattività e dopo un tot forzare il logout in automatico.
     
Sto caricando...

Condividi questa Pagina