« 15 Dicembre 2004 - Cronache dalla rete | Principale | 16 Dicembre 2004 - Cronache dalla rete »
15/12/04
Autenticazione in area privata con Php e MySQL
In questo articolo parliamo dell'autenticazione degli utenti per aree private, fornendo un esempio di area amministrativa per la gestione dei contenuti di un sito.
Prima di cominciare a spiegare il codice, vi invito a leggere un po' di documentazione su php.net riguardante i cookie e le sessioni.
Gli script completi sono scaricabili qui (vi consiglio di farlo subito poichè spiegherò solo parte del codice).
Dopo queste piccole premesse, passiamo subito a vedere la struttura dell'applicazione:
Autenticazione
|
|-------- Directory: includes
| |
| |-------- File: auth.lib.php
|
|-------- File: common.php
|
|-------- File: config.php
|
|-------- File: index.php
|
|-------- File: logout.php
|
|-------- File: pagina.php
Nell'archivio scaricabile c'è anche un file di nome "table_data.sql" che contiene le istruzioni sql per la creazione delle tabelle nel db.
Entriamo nel dettaglio e cominciamo a vedere le tabelle del db che conterranno le informazioni per l'accesso:
File che contiene queste istruzioni: table_data.sql
CREATE TABLE `users` (
`user_id` mediumint(8) unsigned NOT NULL auto_increment,
`user_name` varchar(20) NOT NULL default '',
`user_username` varchar(20) NOT NULL default '',
`user_passwd` char(32) NOT NULL default '',
PRIMARY KEY (`user_id`),
UNIQUE KEY `user_username` (`user_username`)
);
La tabella users contiene 4 campi
- user_id: L'ID univoco per l'indentificazione degli utenti
- user_name: Un nome per l'utente
- user_username: La username dell'utente che sarà utilizzata per verificare l'accesso all'area privata (è stato creato anche un indice di chiave univoca per questo campo)
- user_passwd: La password che l'utente utilizzerà per efftuare il login (un char(32) poichè conterrà la password criptata con la funzione MD5)
Naturalmente potete aggiungere altri campi a questa tabella con le informazioni dell'utente, ad esempio il cognome, l'e-mail, etc.
Mettiamo subito qualche utente nella tabella appena creata e creiamo la tabella per le sessioni:
INSERT INTO users (user_name, user_username, user_passwd) VALUES ('Mario', 'moon', MD5('test'));
INSERT INTO users (user_name, user_username, user_passwd) VALUES ('Fabio', 'upwd', MD5('test2'));
INSERT INTO users (user_name, user_username, user_passwd) VALUES ('Giuseppe', 'alliance', MD5('test3'));
CREATE TABLE `sessions` (
`session_id` char(32) NOT NULL default '',
`session_user_id` mediumint(8) NOT NULL default '0',
`session_start` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`session_id`),
KEY `session_user_id` (`session_user_id`)
);
3 campi per la tabella sessions, nel dettaglio abbiamo:
- session_id: ID univoco per identificare la sessione
- session_user_id: l'ID dell'utente preso dalla tabella users
- session_start: La data e l'orario di creazione della sessione
Ora passiamo a spiegare i file dell'applicazione, cominciamo dal file config.php
<?php
define('HOST', 'host');
define('USERNAME', 'username');
define('PASSWD', 'password');
define('DB_NAME', 'test');
define('COOKIE_NAME', 'user_data');
define('REDIRECT_PAGE', 'pagina.php');
define('LOGIN_PAGE', 'index.php');
?>
Come vedete in questo file sono definite alcune costanti, le prime 4 sono i parametri per la connessione e selezione del db, le restanti 3 sono configurazioni per la nostra applicazione, il nome del cookie, la pagina di redirect (nel caso di accesso consentito dopo il login) e infine la pagina con la form di login.
Vediamo il file common.php:
<?php
include('config.php');
include('includes/auth.inc.php');
$link = @mysql_connect(HOST, USERNAME, PASSWD)
or die('Connessione al database fallita.');
@mysql_select_db(DB_NAME)
or die('Selezione del database fallita.');
?>
Questo file include il config.php (che abbiamo appena visto) e il file auth.lib.php che è la libreria con le funzioni di autenticazione.
Brevemente vi spiego gli altri file per poi passare alle funzioni più importanti contenute nel file auth.lib.php.
- index.php: Contiene la form di login e richiami a funzioni della libreria di autenticazione
- logout.php: richiama la funzione per la distruzione del cookie di sessione
- pagina.php: una semplice pagina protetta che viene visualizzata dopo un corretto login
Siamo arrivati all'ultimo file "auth.lib.php", che contiene 5 funzioni:
<?php
function auth_check_user_login($username, $passwd)
{
/* .... */
}
?>
Questa funzione viene richiamata dopo il submit della form di login, infatti vediamo che richede i parametri username e passwd per effetuare una query di verifica sul database. Se la query va a buon fine e l'utente si è autenticato correttamente questa funzione ritorna true e viene richiamata la funzione successiva.
<?php
function auth_session_begin($user_id)
{
/* .... */
}
?>
Viene utilizzata per iniziare la sessione spedendo un cookie e inserendo nella tabella sessions la nuova sessione
<?php
function auth_generate_sid()
{
/* .... */
}
?>
Viene utilizzata da auth_session_begin() per la creazione dell'ID univoco di sessione
<?php
function auth_check_user()
{
/* .... */
}
?>
Utilizzata in tutte le pagine che vogliamo proteggere, se l'utente è loggato recupera i dati dalla tabella users (ad esempio il suo nome), se invece non è loggato viene rediretto sulla pagina di autenticazione (nel nostro caso index.php) per effetuare l'autenticazione.
<?php
function auth_session_destroy()
{
/* .... */
}
?>
Usata solo nel file logout.php, come ci suggerisce il suo nome serve ad eliminare la sessione.
Conclusioni
Si può lavorare ancora su questa applicazione per renderla più completa. In questo esempio ho cercato di renderla di facile personalizzazione e comprensione in modo da faciltarne l'utilizzo anche agli utenti meno esperti.
Inviato da Lorenzo Torello alle 12:09 in Php | Permalink
TrackBack
TrackBack URL per questo post:
http://www.typepad.com/services/trackback/6a00d8341c706653ef00d8343e305553ef
I blog che linkano questo post: Autenticazione in area privata con Php e MySQL
Commenti
Salve,
volevo avvisare l'autore dell'articolo "Autenticazione in area privata con php e mysql" che il il file.rar che dovrebbe contenere tutti gli script, in realtà ne contiene solo due e sono config.php e common.php;
A me piacerebbe approfondire il discorso potendo scrutinare anche il resto del codice in maniera tale da dare un giudizio finale!!
Mi andrebbe anche bene che mi vengano inviati per posta!!
Cordiali saluti
rocoat82
Inviato da: rocoat82 | 15 marzo 2005 alle 00:54
Salve, vorrei sapere perchè se clicco sul collegamento che dovrebbe contenere il codice completo mi si apre una pagina che contiene una serie di caratteri illegibili?
Cordiali Saluti
Inviato da: ludya | 22 marzo 2005 alle 00:01
il file funziona perfettamente, se te lo apre nel browser è perchè è molto piccolo e lui pensa sia una pagina usa un download manager per scaricarlo e vedrai che funziona perfettamente
Inviato da: G[3z] | 5 aprile 2005 alle 23:30
Salve, stavo utilizzando i file per l'autenticazione utente. Non riesco a superare un piccolo inconveniente
e cioè che quando effettuo il login viene visualizzato un errore. Sembrerebbe che l'errore sia nella funtion sottostante:
function auth_generate_sid()
{
$sid = md5(uniqid(rand(), true));
return $sid;
}
L'interprete si blocca sulla chiusura della function.
Inviato da: Lino | 10 aprile 2005 alle 18:33
come si imposta la dimensione massima dei files uploadati
Inviato da: emanuele | 20 aprile 2005 alle 16:24
Salve, ho provato lo script ma quando inserisco user e pass mi dice sempre username o pass errati
perchè?
Inviato da: Salvaotore | 9 giugno 2005 alle 16:45
Scusate ma sono alle prime armi, le tabelle del db come vanno inserite nel server come devono essere compilate,
io ho fatto come pensavo ma quando vado a richiamare la pagina index.php (che dovrebbe essere quella dove inserire User e passw)mi da il seguente errore, "connessione al data base fallita"
Inviato da: Antonio | 15 settembre 2005 alle 10:32
Bella e completa, va bene per iniziare, ma effettuare si scrive con due t
Inviato da: Adriano | 2 ottobre 2006 alle 17:47
Ciao a tutti, ho risontrato il seguente errore:
Si è verificato un errore nell'avvio della sessione.
Allora, credo di aver seguito tutti i passaggi perfettamente, da quanto sembra i cookie funzionano, perché ho creato un script in php che mi dimostra ciò.
I dati dal database riesce ad importarli perchp nel momento in cui inserisco username e password errati mi restituisce il messaggio che i dati sono errati.
Quando invece, la username e la password sono inseriti correttamente mi risponde con l'errore sopracitato.
Spero che mi possiate essere d'aiuto...
Grazie in anticipo.
Inviato da: Eros | 5 ottobre 2006 alle 19:00
Grazie mille lorenzo!!!
Funziona perfettamente :)
raga un consiglio: seguite passo passo e capirete ^^
Ciaùù
Inviato da: Dj_giulia | 5 luglio 2007 alle 19:49
Scusatemi ma... se volessi metterlo in una sotto directory tipo: area_privata/index.php come devo fare ??
Ho provato modificanto tutti i file ma dice:
Fatal error: Call to undefined function: auth_check_user_login() in /membri/.../area_privata/index.php on line 12
Cosa posso fare ?? Grazie..
La mia mail è: dazec93@yahoo.it
Inviato da: Amico... | 12 luglio 2007 alle 17:29
non riesco ad effettuare l' accesso. mi da sempre username e password errati. aiuto!!!
Inviato da: francesco | 11 ottobre 2007 alle 10:05
ma questo script usa sia i cookie che le sessioni ?
Inviato da: Matteo | 3 dicembre 2007 alle 13:00
Ho cercato di provare lo script, ma a me' come ad altri utenti, mi dà errore.
facendo un debug, l'errore famoso (Si è verificato un errore nell'avvio della sessione) proviene dalla funzione auth_session_begin perchè sembra che nella variabile result non ci sia nulla, come è possibile???
Inviato da: Maurizio | 16 ottobre 2008 alle 17:43
Funziona!!! avevo messo il sql che scritto in questa pagina, e invece no, prendete quello che nell'archivio rar!!!!!!!!!!!!!
Inviato da: Maurizio | 16 ottobre 2008 alle 17:57
Ottimo, semplice, però se carico direttamente pagina.php senza essere loggato esce bianca senza rimandarmi al alla pagina di login. Avro' sbagliato qualcosa?
aiutatemi grazie
Cristian
Inviato da: Cristian | 11 dicembre 2008 alle 14:50
Ottimo, semplice, però se carico direttamente pagina.php senza essere loggato esce bianca senza rimandarmi al alla pagina di login.
RETIFICO
la prima volta funziona, poi non più... bisogna chiudere il browser e riaprirlo allora torna a funzionare tutto una sola volta.
aiutatemi grazie
Cristian
Inviato da: Cristian | 12 dicembre 2008 alle 09:34
il link 'qui' all'nizio nella frase:
"Gli script completi sono scaricabili qui (vi consiglio di farlo subito poichè spiegherò solo parte del codice)."
mi apre una pagina piena di caratteri strani. Come posso fare?
Inviato da: Maurizio | 8 settembre 2009 alle 13:55



