Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Automa autenticazione

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174

    Automa autenticazione

    Salve a tutti. Sto implementando un sistema di autenticazione per un sito in cui è disponibile l'opzione remeber me per eseguire l'accesso automatico in caso di terminazione della sessione. Ho fatto una prima implementazione ma non funziona come dovrebbe quando si fà un refresh e la sessione è scaduta, pertanto ho cercato di schematizzare una versione nuova come asf e desideravo mostrarvela per avere un vostro giudizio.
    Premetto che sono costretto ad usare i cookie, ovviamente per implementare l'opzione remember me e la sessione per memorizzare dei dati temporanei dell'utente che ha eseguito il login.
    Nell'allegato c'è l'automa dove gli eventi e le azioni si esplicano da soli.
    Grazie a coloro che mi daranno una mano.
    Immagini allegate Immagini allegate

  2. #2
    Perchè non funziona come dovrebbe?

    nel senso quando fai il controllo su logged, prima controlli che la Session sia inizializzata come dovrebbe (quindi è loggato).. se nel frattempo è scaduta la sessione, il controllo fallirà quindi provi a vedere se esiste il cookie del remember me e provi a tirar su la sessione dal cookie... se il cookie non esiste, tornerà alla login...

    Dove si blocca il tuo script?
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Ciao, grazie per la tua risposta. Forse mi sono spiegato male. Lo script che ho già implementato ha dei problemi. L'automa è una progettazione exnovo. Diciamo che è la prima volta che mi cimento a fare un sistema di autenticazione in php (ho sempre lavorato con jsp e li le cose sono un pò diverse) e chiedevo se l'algoritmo poteva andar bene. Se magari ci sono dei miglioramenti possibili.

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Ho provato ad implementare l'algoritmo che rispecchi l'automa. Pensate sia conforme. Lo so che sono un rompiballe, ma sono all'inizio e voglio capire capire il PHP perchè mi sembra sia un linguaggio di scripting formidabile. Grazie ancora.

    Pagina per l'interazione col visitatore
    codice:
    <?php
    session_start();
    
    define('SESSION_TTL', 30);
    
    echo '<pre>';
    print_r($_SESSION);
    echo '</pre>';
    
    echo '<pre>';
    print_r($_COOKIE);
    echo '</pre>';
    ?>
    <html>
        <head>
            <title>PHP Autentication</title>
        </head>
        <body>
    <?php
    
    echo 'controllo se la sessione &egrave; scaduta...';
    if (isset($_SESSION['lifetime']) && (time() - $_SESSION['lifetime'] > SESSION_TTL)) {
        echo 'si.
    ';
        session_unset();
        session_destroy();
    
        echo 'controllo se esiste il cookie...';
        if (isset($_COOKIE['phpaut'])) {
            echo 'si. Rigenero la sessione.
    ';
            session_start();
            $session_data = array(
                'lifetime' => time(),
                'username' => $_COOKIE['phpaut']['username'],
                'password' => $_COOKIE['phpaut']['password']
            );
            $_SESSION = $session_data;
            
            header('Location: ' . $_SERVER['PHP_SELF']);
        } else {
            echo 'nessun cookie.
    ';
            echo 'faccio il logout.
    ';
        }
    } elseif (isset($_SESSION['lifetime'])) {
        echo 'no: faccio il refresh della sessione
    ';
        $_SESSION['lifetime'] = time();
    } else {
        echo 'nessuna sessione.
    ';
    }
    
    if (isset($_SESSION['username'])) {
    ?>
            
    
    Benvenuto <?php echo $_SESSION['username']; ?></p>
            logout
    <?php
    } else {
        if (isset($_GET['action'])) {
            echo '
    
    ' . $_GET['action'] . '</p>';
        }
    ?>
            <form action="transaction.php?action=login" method="post">
                <table>
                    <tr>
                        <td>username</td>
                        <td><input type="text" name="username" /></td>
                    </tr>
                    <tr>
                        <td>password</td>
                        <td><input type="password" name="password" /></td>
                    </tr>
                    <tr>
                        <td></td>
                        <td><input type="checkbox" name="rem" />ricordami</td>
                    </tr>
                    <tr>
                        <td></td>
                        <td colspan="2"><input type="submit" name="action" value="login" /></td>
                    </tr>
                </table>
            </form>
    <?php
    }
    ?>
    
        </body>
    </html>
    Codice delle transazioni
    codice:
    <?php
    
    session_start();
    
    define('COOKIE_TTL', 120);
    
    echo '<pre>';
    print_r($_POST);
    echo '</pre>';
    
    $action = isset($_GET['action']) ? $_GET['action'] : '';
    switch ($action) {
        case 'login':
            $username = isset($_POST['username']) ? $_POST['username'] : '';
            $password = isset($_POST['password']) ? $_POST['password'] : '';
    
            if (!empty($username) && $username == 'pippo' && !empty($password) && $password == '12345') {
                // dati corretti
                // creo sessione
                $session_data = array(
                    'lifetime' => time(),
                    'username' => 'pippo',
                    'password' => '12345'
                );
                $_SESSION = $session_data;
                
                // controllo se si preferisce memorizzare le informazioni
                if (isset($_POST['rem'])) {
                    // creo cookie
                    $cookie_data = array(
                        'username' => 'pippo',
                        'password' => '12345'
                    );
                    $exp_date = time() + COOKIE_TTL;
                    setcookie('phpaut[username]', $cookie_data['username'], $exp_date);
                    setcookie('phpaut[password]', $cookie_data['password'], $exp_date);
                }            
    
                header('Location: ' . $_SERVER['HTTP_REFERER']);
            } else {
                // dati errati
                header('Location: index.php?action=login_failure');
            }
            break;
        case 'logout':
            // distruggo la sessione
            unset($_SESSION);
            session_destroy();
            
            // rendo scaduti i cookie
            setcookie('phpaut', null, time() - COOKIE_TTL);
    
            header('Location: index.php');
            break;
        default:
            header('Location: ' . $_SERVER['HTTP_REFERER']);
    }
    ?>
    Magari può servire a qualcuno. Gli esempi che ho trovato io mi hanno lasciato con 1k dubbi.

  5. #5
    a parte che il session_unset e session_destroy li metterei nell'else di

    codice:
    if (isset($_COOKIE['phpaut'])) {
    logicamente non mi pare ci siano grossi sbagli... quali comportamenti strani o errati genera?
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Ho aggiunto questo frammento
    codice:
    echo 'controllo se esiste il cookie per il login automatico...';
    if (isset($_COOKIE['phpaut']) && !isset($_SESSION)) {
        echo 'si. Genero la sessione.
    ';
        session_start();
        $session_data = array(
            'lifetime' => time(),
            'username' => $_COOKIE['phpaut']['username'],
            'password' => $_COOKIE['phpaut']['password']
        );
        $_SESSION = $session_data;
    
        header('Location: ' . $_SERVER['PHP_SELF']);
    } else {
        echo 'nessun cookie.
    ';
    }
    in index.php prima di controllare se la sessione è scaduta (riga 21) e mi da un problema con uno scenario del genere:

    - apro la pagina
    - faccio il login facendogli settare il cookie (metto il check in ricordami)
    - chiudo il browser

    A questo punto la sessione viene distrutta, ma il cookie rimane. Giusto?

    - riapro la pagina ma non viene fatto il login in automatico.

  7. #7
    si in effetti hai ragione anche te...

    proviamo con pseudocodice va:

    codice:
    IF ESISTE LIFETIME IN SESSION THEN
    
    	IF TIME - LIFETIME > SESSION_TTL THEN
    		'sessione scaduta
    		IF ESISTE COOKIE REMBER ME THEN
    			'ritiro su la sessione dal cookie e aggiorno lifetime
    		ELSE
    			'cancello la sessione e redirect alla pagina di login
    	ELSE
    		'aggiorno il lifetime della sessione e procedo la navigazione
    
    ELSE
    	'non esiste la sessione, controllo i cookie
    	IF ESISTE COOKIE REMBER ME THEN
    		'ritiro su la sessione dal cookie
    	ELSE
    		'redirect alla pagina di login
    
    END IF
    una cosa del genere
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174

    [RISOLTO]

    Infatti era proprio ciò che serviva...
    Grazie infinite, sei stato veramente gentile nell'aiutarmi

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Posto il codice completo. Un esempio in più di codice funzionante non fa mai male

    index.php
    codice:
    <?php
    session_start();
    
    define('SESSION_TTL', 30);
    
    echo '<pre>';
    print_r($_SESSION);
    echo '</pre>';
    
    echo '<pre>';
    print_r($_COOKIE);
    echo '</pre>';
    ?>
    <html>
        <head>
            <title>PHP Autentication</title>
        </head>
        <body>
    <?php
    
    echo 'controllo se la sessione &egrave; valida...';
    if (isset($_SESSION['lifetime'])) {
        if (time() - $_SESSION['lifetime'] > SESSION_TTL) {
            echo 'no.
    ';
            session_unset();
            session_destroy();
    
            echo 'controllo se esiste il cookie...';
            if (isset($_COOKIE['phpaut'])) {
                echo 'si. Rigenero la sessione.
    ';
                session_start();
                $session_data = array(
                    'lifetime' => time(),
                    'username' => $_COOKIE['phpaut']['username'],
                    'password' => $_COOKIE['phpaut']['password']
                );
                $_SESSION = $session_data;
    
                header('Location: ' . $_SERVER['PHP_SELF']);
            } else {
                echo 'nessun cookie.
    ';
            }
        } else {
            echo 'si.
    ';
        }
    } else {
        // la sessione non è valida
        echo 'nessuna sessione.
    ';
        echo 'controllo se esiste il cookie...';
        if (isset($_COOKIE['phpaut'])) {
            echo 'si. Rigenero la sessione.
    ';
            session_start();
            $session_data = array(
                'lifetime' => time(),
                'username' => $_COOKIE['phpaut']['username'],
                'password' => $_COOKIE['phpaut']['password']
            );
            $_SESSION = $session_data;
            
            header('Location: ' . $_SERVER['PHP_SELF']);
        } else {
            echo 'nessun cookie.
    ';
        }
    }
        
    if (isset($_SESSION['lifetime'])) {
        echo 'faccio il refresh della sessione
    ';
        $_SESSION['lifetime'] = time();
    }
    
    if (isset($_SESSION['username'])) {
    ?>
            
    
    Benvenuto <?php echo $_SESSION['username']; ?></p>
            logout
    <?php
    } else {
        if (isset($_GET['action'])) {
            echo '
    
    ' . $_GET['action'] . '</p>';
        }
    ?>
            <form action="transaction.php?action=login" method="post">
                <table>
                    <tr>
                        <td>username</td>
                        <td><input type="text" name="username" /></td>
                    </tr>
                    <tr>
                        <td>password</td>
                        <td><input type="password" name="password" /></td>
                    </tr>
                    <tr>
                        <td></td>
                        <td><input type="checkbox" name="rem" />ricordami</td>
                    </tr>
                    <tr>
                        <td></td>
                        <td colspan="2"><input type="submit" name="action" value="login" /></td>
                    </tr>
                </table>
            </form>
    <?php
    }
    ?>
    
        </body>
    </html>
    transaction.php
    codice:
    <?php
    
    session_start();
    
    define('COOKIE_TTL', 120);
    
    echo '<pre>';
    print_r($_POST);
    echo '</pre>';
    
    $action = isset($_GET['action']) ? $_GET['action'] : '';
    switch ($action) {
        case 'login':
            $username = isset($_POST['username']) ? $_POST['username'] : '';
            $password = isset($_POST['password']) ? $_POST['password'] : '';
    
            if (!empty($username) && $username == 'pippo' && !empty($password) && $password == '12345') {
                // dati corretti
                // creo sessione
                $session_data = array(
                    'lifetime' => time(),
                    'username' => 'pippo',
                    'password' => '12345'
                );
                $_SESSION = $session_data;
                
                // controllo se si preferisce memorizzare le informazioni
                if (isset($_POST['rem'])) {
                    // creo cookie
                    $cookie_data = array(
                        'username' => 'pippo',
                        'password' => '12345'
                    );
                    $exp_date = time() + COOKIE_TTL;
                    setcookie('phpaut[username]', $cookie_data['username'], $exp_date);
                    setcookie('phpaut[password]', $cookie_data['password'], $exp_date);
                }            
    
                header('Location: ' . $_SERVER['HTTP_REFERER']);
            } else {
                // dati errati
                header('Location: index.php?action=login_failure');
            }
            break;
        case 'logout':
            // distruggo la sessione
            unset($_SESSION);
            session_destroy();
            
            // rendo scaduti i cookie
            setcookie('phpaut[username]', null, time() - COOKIE_TTL);
            setcookie('phpaut[password]', null, time() - COOKIE_TTL);
    
            header('Location: index.php');
            break;
        default:
            header('Location: ' . $_SERVER['HTTP_REFERER']);
    }
    ?>
    Saluti a tutti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.