Class LogIn

Classe Mista Pubblica/Privata con dipendenze a:

  • VerifySend()
  • DB
  • Session
  • Language
  • Crypto

I Metodi pubblici:

  1. protection()
  2. logout()

Questa classe si dovrebbe utilizzare solo se durante la fase di installazione di RGL abbiamo deciso di installare il login. In caso contrario la classe potrà rimanere silenziata.

Permette di effettuare il login/logout facilmente senza perdere troppo tempo nel preparare script e tabella. Come sempre... siete liberi di non usarla e creare un metodo tutto vostro ;-).

Ora analizzeremo prima i metodi proposti per poi fare un esempio concreto.


Protection():

Il metodo dovrà essere utilizzato all'interno della View subito dopo la chiusura della classe e prima del metodo inizializzato view_page(). Ma un buon esempio sarà più esplicativo:

class TestView extends TestModel {
  ...
  ...
}
LogIn::protection(array('admin'), array(10,9), false);
LogIn::logout();
InsertCoverView::view_page();
?>

Il metodo protection() offre numerose soluzioni per la protezione della pagina. Ma prima di entrare nello specifico è importante conoscere la composizione della tabella logins.

Le colonne saranno:

|----|-------|----------|--------|-----|-------|------|---------|
| id | email | password | active | cat | level | name | surname |
|----|-------|----------|--------|-----|-------|------|---------|
  • email: conterrà un indirizzo email identificativo dell'utente (username);
  • password: conterrà la password codificata dal metodo Crypto::gen_pass();
  • active: lo stato se attivo (1) o non attivo (0);
  • cat: categoria di appartenenza, ad esempio admin, superuser, user, etc.;
  • level: livello dei permessi. In genere da 1 a 10, ma nulla ci vieta di utilizzare altri numeri.
  • name e surname: il nome e cognome dell'utente.

Potremmo aggiungere altre colonne al db che verranno riconosciute automaticamente dallo script.

Importante: se aggiungiamo nuove colonne, queste dovranno essere poste sempre alla fine (dopo surname) per non pregiudicare la classe.

Effettuato un ipotetico login, i dati verranno passati ad una sessione che ne custodirà i dati per tutto il tempo della navigazione.

Il metodo protection() potrà essere usato in due modi diversi,

il primo con un redirect:

Login::protection(
    array('user', 'admin'), 
    array(9, 10), 
    array('user'=>'dashboard/', 'admin'=>'test/')
);

Cosa abbiamo detto in questo esempio? Semplicemente che che se si appartiene alla

categoria user con livello 9 o 10 di atterrare nella pagina dashboard/;

oppure

categoria admin con livello 9 o 10 di atterrare nella pagina test/;

Non dovrebbe essere così difficile!

L'altro sistema è privo del redirect ed effettua semplicemente il controllo di coerenza dei dati se coincidono si continua altrimenti viene cancellata la sessione di login ed indirizzati alla pagina di logout configurabile all'interno del file ./Config/config.php alla voce _CONFIG_['_LOGOUT_'] e si utilizza:

Login::protection(
    array('user', 'admin'), 
    array(9, 10), 
    false)
);

Anche in questo caso l'esempio dovrebbe risultare molto semplice.


logout():

Questo metodo serve a cancellare la sessione di login e di riportare l'utente nella pagina di logout.

Si utilizza subito dopo il metodo protection()

LogIn::protection(array('admin'), array(10,9), false);
LogIn::logout();

Per effettuare il logout, basta inviare una variabile GET (?exit=1) nella barra degli indirizzi:

localhost/test/?exit=1

Il metodo, prenderà in carico la richiesta e cancellerà i dati memorizzati.


Esempio concreto di utilizzo del login:

Prima di procedere è bene ricordare che all'interno del file ./Config/config.php, troviamo le costanti:

// LOGIN
'_TABLE_' => 'dc_logins',
'_USER_INPUT_' => 'username', // name input user
'_PASS_INPUT_' => 'password', // name input password

_TABLE_ ci indica il nome della tabella dove salvare i dati di login;
_USER_INPUT_ ci indica il nome che il campo input dovrà avere per lo username/email;
_PASS_INPUT_ ci indica il nome che il campo password dovrà avere per impostare appunto la password;

Attenzione: Questi campi, dovranno quindi seguire questa restizione per poter funzionare!

Ora iniziamo a scrivere qualche riga di codice ed iniziamo dal file di template index.php:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Mio Progetto</title>
    </head>
    <body>
        <form class="" action="./" method="post">
            Username: <br>
            <input type="email" name="username" value="" required> <br>
            Password: <br>
            <input type="password" name="password" value="" required> <br><br>
            <input type="submit" name="logins" value="Login">
        </form>
    </body>
</html>

Ora passiamo alla View indexView.php ed inseriamo questo codice:

<?php
// aggiungo nell'array i percorsi dei file ed i nomi delle classi che mi servono per gestire questa pagina
$GLOBALS["Rgl"] = new $nameClass(
    array(
        "Crypto", // gestione Criptazione
        "Session", // gestione delle sessioni
        "Language", // gestione delle lingue
        "Avvisi", // gestore avvisi e alert
        "Str", // trattamento delle stringhe
        "DTime", // trattamento delle date
        "VerifySend", // verifica i dati in invio
        #"SendMail", // invia email in vari formati
        "DB", // gestione del DB in PDO comprende (MySql, SqLite, PostgreSql)
        #"MySql", // gestione del DB Mysql
        #"SqLite", // gestione del DB SqLite
        #"PgSql", // gestione del DB PstgreSql
        "BreadC", // gestione briciole di pane
        #"UploadFile", // Upload File & image
        "LogIn", // gestione Login
        #"Files", // gestione dei file fisici
        #"Restful" // ,
    )
);

class IndexView extends IndexModel {

    # gestione contenuto pagina ####
    function view_page(){
        ### stampo la pagina dei contenuti
        KuiperBelt::get_template(
            'index.php',
            $GLOBALS["Rgl"],
            array(
                'benvenuto'=>Language::translate()['welcome_rgl'],
                'generate'=>Language::translate()['generate_page'],
                'logins'=>$logins,
            )
        );
    }
}

if($_POST['logins'] && $_POST['username'] && $_POST['password']){
    Login::protection(array('admin'), array(10), array('admin'=>'test/'));
}
LogIn::logout();
IndexView::view_page();
?>

Potremmo già esserci, ma voglio entrare nello specifico e quindi analizzeremo anche le pagine successive (in questo caso la pagina test creata in precedenza).

Apriamo la pagina di template test.php e scriviamo:

<h1>Ciao <?php echo $_['utente']; ?></h1>

Ora apriamo la pagina di view testView.php ed inseriamo:

<?php
// Codifica caratteri
header("Content-Type: text/html; charset=utf-8");
#header("Content-type: application/json");
$GLOBALS["Rgl"] = new $nameClass(
    array(
        "Crypto", // gestione Criptazione
        "Session", // gestione delle sessioni
        "Language", // gestione delle lingue
        "Avvisi", // gestore avvisi e alert
        "Str", // trattamento delle stringhe
        "DTime", // trattamento delle date
        "VerifySend", // verifica i dati in invio
        #"SendMail", // invia email in vari formati
        "DB", // gestione del DB in PDO comprende (MySql, SqLite, PostgreSql)
        #"MySql", // gestione del DB Mysql
        #"SqLite", // gestione del DB SqLite
        #"PgSql", // gestione del DB PstgreSql
        "BreadC", // gestione briciole di pane
        #"UploadFile", // Upload File & image
        "LogIn", // gestione Login
        #"Files", // gestione dei file fisici
        #"Restful" // request and response restful,
    )
);

class TestView extends TestModel {

    # gestione contenuto pagina ####
    function view_page(){
        $utente = $_SESSION['name'].' '.$_SESSION['surname'];
        ### stampo la pagina dei contenuti
        KuiperBelt::get_template(
            'test.php',
            $GLOBALS["Rgl"],
            array(
                'utente'=>$utente,
            )
        );
    }
}
LogIn::protection(array('admin'), array(10), false);
LogIn::logout();
TestView::view_page();
?>

Siamo pronti per testare la nostra pagina di login.

Nella barra degli indirizzi del nostro browser digitiamo

http://localhost/mio_progetto/

Inseriamo username (email), password utilizzati durante la fase di installazione e premiamo il pulsante login.

Se tutto è andato per il verso giusto dovremmo essere atterrati sulla pagina test/ con la scritta

Ciao [nome] [cognome]

Potremmo ora sperimentare il logout semplicemente digitando nella barra degli indirizzi la variabile GET (?exit=1). Dovremmo ritornare alla pagina di partenza o nella pagina impostata all'interno del file di configurazione.

Se invece durante la fase di login non ci "spostiamo" dalla index e ci ritorna la varabile GET (er=1):

http://localhost/mio_progetto/?er=1

Probabilmente abbiamo sbagliato qualcosa o non ricordiamo le credenziali di accesso. Consiglio a questo punto ri reinstallare RGL, una versione "pulita" e riprovare. Questa volta potrebbe andare meglio.

Nel caso si dovessero verificare problemi, non esistate a contattarmi, sarò lieto di rispondere o correggere eventuali bug!!!


Altre informazioni:

Un buon metodo per ricevere informazioni rigardanti l'esito di un login non corretto potrebbe essere quello di utilizzare la classe Avvisi

Ad esempio nel template index dubito dopo il tag body potremmo inserire:

<?php echo Avvisi::print_message(); ?>

Così da leggere il messaggio di login non effettuato correttamente.


Lista dei Blocchi