Come creare un sistema di login e gestione utenti.
Questa pillola si ispira ad una più vecchia che potete trovare qui ( http://forum.html.it/forum/showthrea...postid=2105665 ).
Le caratteristiche sono:
Gestione utenti attraverso registrazione ip
Salvataggio su database sqlite (incluso in ogni versione di PHP 5)
Multiutente (mi sembra il minimo)
Supporto per più livelli utenti
1. Per prima cosa creiamo un nuovo database e lo popoliamo con due tabelle:
Tabella users con questa struttura
#
# Table structure for table: users
#
CREATE TABLE users ( name VARCHAR(20) NOT NULL PRIMARY KEY, pass VARCHAR(20) NOT NULL, level INT(1) NOT NULL, email VARCHAR(20) NOT NULL );
# --------------------------------------------------------
Tabella onlineuser con questa struttura
#
# Table structure for table: onlineuser
#
CREATE TABLE onlineuser ( name VARCHAR(20) NOT NULL PRIMARY KEY, ip VARCHAR(20) NOT NULL, time INT(10) NOT NULL );
# --------------------------------------------------------
2. Creiamo un file function.inc.php che conterrà tutte le funzioni
Codice PHP:
<?php
//---------------------------
//connessione al db
function sqlite_connect() {
$db_path = 'login.db'; // path del database
$sq1 = sqlite_open("$db_path", 0666, $sqlite_error);
//in caso di errore
if(!$sq1) {
die("error".$sqlite_error);
}
return $sq1;
}
//---------------------------
function check($ip, $ul) {
$sq = sqlite_connect(); // connessione db
$queryou = sqlite_fetch_array(sqlite_query($sq, "SELECT name,time FROM onlineuser WHERE ip='$ip'"));
if ($queryou == '') {
return 3; // bisogna effettuare il login
} else {
$time1 = @time();
if ($time1>$queryou['time']) {
return 3;
} else {
$username = $queryou['name'];
$queryu = sqlite_fetch_array(sqlite_query($sq, "SELECT level FROM users WHERE name='$username'"));
if ($queryu['level'] == $ul) {
$time = @time()+60*5;
$updatetime = sqlite_query($sq, "UPDATE onlineuser SET time='$time' WHERE name='$username'");
return 1;
} else {
return 2; // non si hanno i privilegi
}
}}
sqlite_close($sq);
}
//---------------------------
function login($ip) {
$sq = sqlite_connect(); // connessione db
$user = $_POST['user'];
$pass = $_POST['pass'];
//-- cancella vecchi utenti online
$nw = @time();
$querytime = sqlite_query($sq, "DELETE FROM onlineuser WHERE time<'$nw'");
//---fine cancella vecchi utenti
$queryexist = sqlite_fetch_array(sqlite_query($sq, "SELECT name,time FROM onlineuser WHERE ip='$ip'"));
$querypass = sqlite_fetch_array(sqlite_query($sq, "SELECT pass FROM users WHERE name='$user'"));
if ($queryexist != '') {
return 3; // gia connesso
} else {
if ($querypass['pass'] == md5($pass)) {
$time = @time()+60*10;
$queryinsert = sqlite_query($sq, "INSERT INTO onlineuser (name,ip,time) VALUES ('$user','$ip','$time')");
if ($queryinsert){
return 1; } else { //login effettuato
return 4; } // errore di inserimento nel db
} else {
return 2; // password o nome sbagliati
}}
sqlite_close($sq);
}
//---------------------------
function logout($ip) {
$sq = sqlite_connect(); // connessione db
$querydelete = sqlite_query($sq, "DELETE FROM onlineuser WHERE ip='$ip'");
if ($querydelete) {
return 1; //logout effettuato
} else {
return 2; //errore nel logout
}
sqlite_close($sq);
}
//---------------------------
function registration($ul) {
$sq = sqlite_connect(); // connessione db
$name = sqlite_escape_string(trim($_POST['name']));
$pass = sqlite_escape_string(trim($_POST['pass']));
$mail = sqlite_escape_string(trim($_POST['mail']));
if (preg_match('/^[a-zA-Z0-9_]{4,28}$/',$name)) { // user da 4 a 28 alfanumerci con underscore
if (preg_match('/^[A-Za-z0-9]{4,15}$/',$pass)) { // pass da 4 a 15
if (preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',$mail)) { // verifica se è una mail
$queryname = sqlite_fetch_array(sqlite_query($sq, "SELECT name FROM users WHERE name='$name'"));
if (!$queryname) {
$queryinsert = sqlite_query($sq, "INSERT INTO users (name,pass,level,email) VALUES ('$name','$pass','$ul','$mail')");
if ($queryinsert) {
return 1; // registrazione avvenuta con successo
} else {
return 5; } // errore nell'inserimento
} else {
return 6; } // utente gia presente nel database
} else { return 4; } // campo mail errato
} else { return 3; } // campo pass errato
} else { return 2; } // campo nome errato
sqlite_close($sq);
}
//---------------------------
function realip()
{
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) == TRUE) {
$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR']; }
if (isset($_SERVER['HTTP_CLIENT_IP']) == TRUE) {
$ipaddress = $_SERVER['HTTP_CLIENT_IP']; }
$ipaddress = $_SERVER['REMOTE_ADDR'];
return $ipaddress;
}
$adip = realip();
//---------------------------
?>
La funzione sqlite_connect crea una nuova connessione con il database e gestisce l'eventuale errore.
La funzione check controlla se l'utente ha effettuato il login e se ha i privilegi necessari per accedere alla pagina. Restituisce 1 se l'utente puà visualizzare la pagina o un altro numero in relazione all'errore.
La funzione login effettua l'inserimento (login) di un utente già registrato nella tabella onlineuser e cancella gli utenti che non sono più online.
La funzione logout cancella l'utente che sta visualizzando la pagina dalla tabella onlineuser.
La funzione registration verifica se i dati inviati dal form sono validi e li inserisce nel database. Eventualmente gestisce gli errori.
La funzione realip restituisce l'ip corretto (se l'utente è dietro proxy restituisce il suo vero ip, non quello del proxy). Questa funzione non l'ho scritta io, ma ha sempre funzionato.
3. Creiamo una pagina per il login
Codice PHP:
<?php
if ( $_GET['login'] == 'ok') {
include ('function.inc.php'); $login = login($adip);
if ($login == '2') { die ("I dati inseriti sono errati."); } // se i dati inseriti sono sbagliati
if ($login == '3') { die ("Sei gia connesso."); } // se l'utente ha gia fatto il login precedentemente
if ($login == '1') { die ("Login effettuato."); } // se il login è andato a buon fine
}?>
Qui si inserisce la pagina di login con un form di questo tipo
<FORM action="login.php?login=ok" method="post"> Nick:<INPUT type="text" name="user"> Password:<INPUT type="password" name="pass"> <INPUT type="submit" value="Entra"> </FORM>
Una pagina per la registrazione
Codice PHP:
<?php
if ( $_GET['reg'] == 'ok') {
$level = '3'; // livello di base di tutti gli utenti al momento dell'installazione
include ('function.inc.php'); $reg = registration($level);
if ($reg == '5') { die ("Si è verificato un errore nell'inserimento."); }
if ($reg == '4') { die ("Inserira una mail corretta."); }
if ($reg == '2') { die ("Il Nome Utente deve essere alfanumerico e compreso tra i 4 ed i 28 caratteri, underscore compresi. "); }
if ($reg == '3') { die ("La password deve essere alfanumerica e compresa tra i 4 ed i 15 caratteri."); }
if ($reg == '1') { die ("Registrazione avvenuta con successo."); }
}?>
Compila il form per registrarti </p>
<form method="post" action="registration.php?reg=ok" name="registration">
Nome Utente:
<input maxlength="28" name="name">
Password:
<input maxlength="15" name="pass" type="password">
Email:
<input name="mail">
<input type="submit" value="Registrati">
</form>
Ed una per il logout
Codice PHP:
<?php
if ($_GET['logout'] == 'ok') {
include ('function.inc.php'); $logout = logout($adip);
if ($logout == '1') { die ("Logout effettuato."); }
if ($logout == '2') { die ("Errore nella procedura di logout."); }
}
?>
Per effettuare il logout fare click [url="logout.php?logout=ok"]qui[/url]</p>
4. Ogni pagina che deve essere protetta deve avere un codice simile:
Codice PHP:
<?php
$level= '3'; // qui si inserisce il livello o il gruppo associato agli utenti che possono visualizzare la pagina
include ('function.inc.php'); $check = check($adip, $level);
if ($check == '2') { die ("Non hai i privilegi per accedere alla pagina"); } // messaggio se il livello non corrisponde a quello dell'utente
if ($check == '3') { die ("Per visualizzare questa pagina bisogna essere registrati ed aver effettuato il login."); } // messaggio se l'utente non ha ancora fatto il login
?>
Qui si inserisce la pagina da proteggere
Spero di esser stato utile. Per qualsiasi questione, chiedete pure.
(Se i moderatori volessero marcare tale pillola come importante ne sarei veramente grato)