Newsgroup: it.comp.www.php
Titolo: Primo esperimento di autenticazione utente e sessioni

Ciao a tutti, sto facendo un progettino di un semplice forum php+mysql 
per esercitarmi con php+mysql (LAMP) e ho qualche difficoltà con la 
parte relativa all'autenticazione dell'utente e delle sessioni.
Volevo utilizzare questo esempio di funzioni per le sessioni
http://php.html.it/articoli/leggi/875/sessioni-alternative-in-php/3/
 (la 
parte che mi serve è dalla pagina che si apre con questo link fino alla 
pagina 6) che, sebbene sia abbastanza elementare, per la mia 
inesperienza non lo è. :(
C'è qualcuno che se la sente di darmi qualche indicazione su come fare 
(nel sito 
html.it
 non ho trovato un tutorial che impiega quell'esempio 
di uso delle sessioni)?
Io ho già la pagina principale del forum (e le conoscenze minimali di 
xhtml, php e interrogazione via php del database mysql necessarie) e il 
form dove poter inserire user_id e password. Ho anche creato la tabella 
del database indicata nell'esempio sopra (per gestire le sessioni e 
memorizzarle in un database per sicurezza) e ho il mio database di 
utenti registrati al forum.
Non riesco a capire la strategia che devo usare.
Devo realizzare:
-la procedura di visualizzazione selettiva del form per l'autenticazione 
(se l'utente è già autenticato il <div> con il form non deve apparire)
-qualora l'utente non sia ancora autenticato, il riconoscimento 
dell'utente (con la tabella degli utenti registrati al forum
-più la memorizzazione e la verifica dei dati nella sessione necessari 
perchè l'autenticazione sia persistente.
Non mi serve ovviamente il codice, solo qualche dritta per realizzare la 
cosa (tipo: verifica se è già stato inserito nome utente e password, se 
si non visualizzare il form di autenticazione; a quel punto verifica se 
nei dati della sessione... ecc.).
  grazie 1000 a chi mi aiuterà!

mrzac ha scritto:

un forum come primo esperimento in php non è un po' troppo complesso?
fai qualche prova prima senza mysql, dal form invii i dati allo stesso 
script e in caso di login positivo, crei le variabili di sessione e 
magari includi qualcosa, che solo appunto chi si autentica puo' vedere.
Almeno per capire le basi, poi metti un link LOGOUT disruggi le 
variabili di sessione, e ti "rediretti" da qualche altra parte.
ciao

 
Una volta che sei autenticato e hai creato le variabili di sessione ti 
riferisci sempre alla sessione per le successive verifiche di chi sta 
accedendo al sito, vero? Anche se ricarichi la pagina principale (dove 
tengo il form con l'inserimento di id e pass).
Una cosa che mi ha colpito (ho poca esperienza di xhtml) è che i valori 
delle variabili POST (tipo lo userid che passo con POST) rimangono 
memorizzati anche col reload della pagina. Ho pensato quindi che una 
volta autenticato (con la verifica sulla tabella degli utenti del db) 
posso far sparire il form con id e pass e riferirmi sempre alla sessione.
Non posso invece, come mi sembrava invece di aver visto in un esempio, 
fare affidamento sull'esistenza o meno della variabile in cui memorizzo 
lo userid perchè quella continua ad esistere dal momento in cui le hai 
assegnato qualcosa.
  ciao e grazie per il supporto.

mrzac ha scritto:

se la variabile di sessione login esiste ed ha come valore "PossoEntrare"
allora non far apparire il form
altrimenti, fai apparire il form.
poi puoi anche utilizzare i cookie, se vuoi dare la possibilità
che anche a distanza dal login, l'utente venga automaticamente 
riconosciuto dal sistema.
quindi
-se il cookie con questo valore esiste ed è un cookie ancora valido 
(vedi come impostare la durata validità) allora crea la variabile di 
sessione login con il valore "PossoEntrare" e non far apparire il form
-se il cookie non c'e' e la variabile di sessione login non esiste fai 
apparire il form.


Grazie. Intanto ho fatto qualche passo avanti nella comprensione di come 
gestire la cosa...


Sembra che le cose inizino a funzionare.... ^________^
Grazie del supporto!

mrzac ha scritto:

non ho fatto nulla....figurati
a dire la verità all'inizio stavo per postare pezzettini di codice....
poi mi sono detto perche' toglierli il piacere della scoperta?
Php offre grande libertà e non esiste un solo modo per fare una 
determinata cosa, sta a te decidere come farla.
ciao

 
Io cercavo quello che hai scritto tu, non il codice, chiamiamola flow 
chart ("se xxxx allora fai yyyyy se il cookie risulta zzzz allora ecc. 
ecc."); quel poco di flow chart che hai scritto, più altro che avevo già 
preso da 
html.it
, è bastato "a darmi il La".
L'unico problema che ho riscontrato per il momento è che:
-la prima volta che mi connetto alla pagina (in localhost, ho apache 
sotto linux che mi fa da server sul mio stesso PC) con il mio browser la 
cosa funziona,
MA
-se ricarico la pagina non è detto che funzioni (anche se faccio 
correttamente il logout).
Sembra che non sempre crei la sessione (lo vedo dal controllo che faccio 
via mysql da console) sul database. Quale può essere il problema? Se 
cancello tutta la cache e i cookie direi che vada sempre.
Mi daresti/dareste un'occhiata al codice della libreria php che avevo 
linkato (sono poche decine di righe di codice)?
Ecco il link: 
http://php.html.it/articoli/leggi/875/sessioni-alternative-in-php/4/
Alle due pagine successive c'è uno scarno esempio pratico (è 
decontestualizzato da una pagina web dove si autentificano gli utenti).
Io lo uso così:
<?php
// Connessione a MySQL e selezione db
include("../../forum/include/config.inc.php");
// Inclusione del file con la classe per gestire le sessioni
require('../../forum/include/db_session_class.php');
// Connessione a MySQL
$db_link = mysql_connect($db_host, $db_user, $db_password) or 
die('Connessione fallita: ' . mysql_error());
// Selezione database
mysql_select_db($db_name, $db_link) or die('Selezione DB fallita: ' . 
mysql_error());
// Istanziamo l'oggetto sessione-> inizializza le variabili necessarie 
al funzionamento del nostro sistema
$my_session = new my_session($session_time, $session_gc_time);
// Avviamo la sessione inviando il cookie al client. ->avvia la sessione 
se ancora non esiste
// (verificando l'eventuale presenza del cookie nel client) o la 
aggiorna (aggiornando il tempo
// di scadenza del cookie), ma solo nel caso in cui si sia settata la 
variabile $session_time
// ad un valore maggiore di zero
$my_session->my_session_start();
// Richiamiamo la procedura di garbage collection ->ripulisce la tabella 
delle sessioni dai record
// più vecchi di $session_gc_time (garbage collection)
$my_session->my_session_gc();
// Inizializziamo l'array che conterrà i dati della sessione
$_MY_SESSION_VARS = array();
//Verifico se id e psw sono riconosciuti
if( (isset($_POST['user_id'])) && ($_POST['user_id']=="prova") && 
($_POST['password']==$_POST['user_id']) ){
echo "<h1>id e pass corretti</h1>";
//Utente riconosciuto: inizio a familiarizzare con i dati di sessione
$my_session->my_session_register('utente', $_POST['user_id']);
$my_session->my_session_register('classe', 'admin');
// verifico che la memorizzazione in $my_session sia OK
$_MY_SESSION_VARS = $my_session->my_session_read();
//ora stampo tutte le variabili di sessione registrate
echo "<pre>\n";
print_r($_MY_SESSION_VARS);
echo "</pre>\n";
echo "<a link alla pagina di logout.php </a>\n";
echo $_MY_SESSION_VARS["classe"];
}
else{
  un form con variabili "user_id" e "password\" che passa alla stessa 
pagina le due variabili con il metodo POST
}
?>
<?php
mysql_close($db_link);
?>
Ecco invece la pagina del logout.php:
<?php
// Connessione a MySQL e selezione db
include("../../forum/include/config.inc.php");
// Inclusione del file con la classe per gestire le sessioni
require('../../forum/include/db_session_class.php');
// Connessione a MySQL
$db_link = mysql_connect($db_host, $db_user, $db_password) or 
die('Connessione fallita: ' . mysql_error());
// Selezione database
mysql_select_db($db_name, $db_link) or die('Selezione DB fallita: ' . 
mysql_error());
// Istanziamo l'oggetto sessione-> inizializza le variabili necessarie 
al funzionamento del nostro sistema
$my_session = new my_session($session_time, $session_gc_time);
// Avviamo la sessione inviando il cookie al client. ->avvia la sessione 
se ancora non esiste
// (verificando l'eventuale presenza del cookie nel client) o la 
aggiorna (aggiornando il tempo
// di scadenza del cookie), ma solo nel caso in cui si sia settata la 
variabile $session_time
// ad un valore maggiore di zero
 
// Inizializziamo l'array che conterrà i dati della sessione
$_MY_SESSION_VARS = array();
 
//Richiamiamo il metodo che ci restituirà le variabili di sessione, e 
memorizziamo
//le stesse nell'array $_MY_SESSION_VARS;
$_MY_SESSION_VARS = $my_session->my_session_read();
//ora stampo tutte le variabili di sessione registrate
echo "<pre>\n";
print_r($_MY_SESSION_VARS);
echo "</pre>\n";
 
// Richiamiamo il metodo che distrugge la sessione
$my_session->my_session_destroy();
 
// verifico che le variabili di sessione siano state cancellate
$_MY_SESSION_VARS = $my_session->my_session_read();
echo "<pre>\n";
print_r($_MY_SESSION_VARS);
echo "</pre>\n";
 
// Chiusura connessione
mysql_close();
?>
<h1>Logout</h1>
  ciao e grazie del supporto!

 
Credo di avere risolto: se l'utente naviga anonimamente per il sito, 
cioè senza essersi autenticato, ad ogni pagina si distrugge la sessione.
Grazie cmq!