Newsgroup: it.comp.www.php
Titolo: Autenticazione HTTP e variabile $PHP_AUTH_USER

Una volta autenticato un utente via HTTP è possibile fare un logout o
cambiare l'utente?
Ho provato con
--
 unset($PHP_AUTH_USER);
--
modificandola o con giochetti simili tra più pagine... ma non ci sono
riuscito.
Come funziona questa variabile?
--
Reply to: brain79(at)
inwind.it
www.brainetwork.net
ICQ#: 42797710 - FeSToso n°143
[aforisma del giorno]

Unsetta la variabile,Rispedisci l'header di autenticazione e l'utente potrà
ri-autenticarsi...
J

 ri-autenticarsi...
E' quello che tentavo di fare... però dopo succede che non riesco più a
loggarmi, mi chede l'autenticazione all'infinito...
...potresti mandarmi un esempio?
Io sono un niubbo, io avevo provato così:
---FILE LOGIN.PHP---
<?
function authenticate(){
 Header( "WWW-Authenticate: Basic realm=\"Prova del sistema di
autenticazione\"");
 Header( "HTTP/1.0 401 Unauthorized");
 echo "Per poter accedere occorre inserire login e password validi";
 exit;
}
if (!isset($PHP_AUTH_USER) ){
  authenticate();
}
?>
<html>
<head>
<title>TITOLO</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
CONTENUTO DELLA PAGINA<br>
<?php
if (isset($PHP_AUTH_USER) ){
 echo "Utente Identificato<br> Username: $PHP_AUTH_USER <br>";
 echo "Password: $PHP_AUTH_PW";
 echo "<FORM ACTION=\"logout.php\" METHOD=POST>";
 echo "<INPUT TYPE=HIDDEN NAME=\"logout\" VALUE=\"1\">";
 echo "<INPUT TYPE=Submit VALUE=\"Logout\">";
 echo "<FORM><br>";
}
?>
</body>
</html>
---FILE LOGOUT.PHP---
if ($logout==1){
  unset($PHP_AUTH_USER);
}
?>
<html>
<head>
<title>TITOLO</title>
<meta HTTP-EQUIV="refresh" CONTENT="3; URL=login.php">
</head>
<body>
ATTENDERE CANCELLAZIONE INFORMAZIONI UTENTE - LOGOUT<br>
</body>
</html>


Ti posto una classe che scrissi qualche tempo fa.
La classe permette di inserire una riga tipo $protezione=new
protezione("20");
nelle pagine .php e quella pagina sarà accessibile solo agli utenti di una
tabella il cui potere, all'interno della stessa, è stabilito in "maggiore o
uguale a 20".
Tale fase di login è fatta sul Nome Cognome e Password contenuti nella
tabella detta "Password".
La tabella Password ha questa forma:
Nome: text
Cognome: text
Livello: numero
Password: text
in particolare ncognome in minuscolo è la login (questo ti serve per
comprendere la concat fatta nella query di SELECT che vedrai infondo).
Tieni presente che uso $GLOBALS['nome_variabile'] per fare riferimento a
variabili di ambiente non leggibili all'interno della classe/funzione.
(secondo me è questo il tuo problema).
Ho cancellato con delle XXXXX il nome dell'azienda che usa questa classe di
autenticazione.
class Protezione{
var $codice_presaler;
// Crea protezione per questo documento a questo livello
function Protezione($codice_livello){
    if ($codice_livello=="") {
        echo("Non essendo stato specificato il livello di questa
pagina,l'accesso è bloccato");
        redirect("/");
        exit();
    }
// Se non c'è settata la username la chiede.Se è vuota richiede
autenticazione, altrimenti si ottiene l'errore 401
    if (!isset($GLOBALS['PHP_AUTH_USER']) or $GLOBALS['PHP_AUTH_USER']=="")
{
            header("WWW-Authenticate: Basic realm=\"XXXX - Tool Moduli
TopMedium\"");
            header("HTTP/1.0 401 Unauthorized");
        sopra("menu_principale_intestazione.gif");
        sotto("Errore 401 - Non autorizzato");
        exit();
      } else {
      }
    $qquery="SELECT Livello,idp FROM Password WHERE
lower(concat(left(Nome,1),Cognome))='$this->login' and
Password=password('$this->pass')";
    include("file_di_connessione_al_server.inc");
    $query=mysql_query($qquery);
// Se la query ha un errore o porta a dati non congruenti o validi, richiede
l'autenticazione ancora
    if (!$query) {
            header("WWW-Authenticate: Basic realm=\"XXXXX - Tool Moduli
TopMedium\"");
            header("HTTP/1.0 401 Unauthorized");
        echo("Si è generato un errore in fase di autenticazione");
        redirect("/"); // Questa è una funzione definita altrove che fa
l'equiv di ridirezione
        exit();
    }
// Se la combinazione login e password porta a 0 o più di un risultato,
sputa l'autenticazione
    if (mysql_num_rows($query)==0 or mysql_num_rows($query)>1) {
            header("WWW-Authenticate: Basic realm=\"XXXXXX - Tool Moduli
TopMedium\"");
            header("HTTP/1.0 401 Unauthorized");
        sopra("menu_principale_intestazione.gif");
        sotto("Errore 401 - Non autorizzato");
        exit();
    }
    $livello_utente=mysql_result($query,0,'Livello');
// Se il livello dell'utente che si è autenticato è maggiore del livello
della pagina (ricordi il numero che compariva tra parentesi nella chiamata
al costruttore della classe $protezione=new protezione("20")) allora OK,
altrimenti lo sputa e gli richiede l'autenticazione.
    if ($livello_utente<$codice_livello) {
            header("WWW-Authenticate: Basic realm=\"XXXXXX - Tool Moduli
TopMedium\"");
            header("HTTP/1.0 401 Unauthorized");
        echo("Utente non abilitato per questa sezione.<BR>Attendere
prego...");
        redirect("/");
        exit();
    }
    $this->livello_presaler=mysql_result($query,0,'Livello');
} // Fine Costruttore
} // Fine Classe Protezione
?>
Dimmi se ti è utile. Se volessi usarla chiama pure via icq che ti aiuto a
configurarla :)
Ciao
J

   unset($PHP_AUTH_USER);
Però aspè :-))
Se logout è uguale a 1 cancella la PHP_AUTH_USER
Ma quando lo script riprende esecuzione, logout vale ancora 1 quindi è come
se l'utente si autenticasse e poi continuasse a cliccare su logout.
Prova con
if ($logout==1){
    unset($PHP_AUTH_USER);
    unset($logout);
}

 
Io ho fatto una breve ricerca su 
www.apache.org
 e nella documentazione
ufficiale accenna al fatto che una volta loggato l'utente non puo' piu'
sloggarsi se non uscendo dal browser e riavviandolo.
Ciao
	Fabio

 }
azz.... bella cosa :( Non ci avevo pensato :(
Io chiamavo il logout come index.php?logout=1
ma mi ero arreso per il fatto che ad ogni reload, $logout tornava a 1 e mi
rifaceva il logout
Ho risolto con un cookies... quando faccio il logout lo setto a 1 e poi lo
cancello finito il login ^^ (un po' macchinoso ma non avevo trovato altre
soluzioni...)
Cmq grazie della idea (fare unset su una variabile passata da GET non mi era
nemmeno passato per la mente... provero')