Newsgroup: it.comp.www.php
Titolo: Problema con autenticazione

Ciao a tutti.
Attualmente ho un sito locale che gestisce la contabilita della mia piccola azienda, realizzato in proprio.
Adesso l'accesso è riservato solo a me col codice
if (!isset($_SERVER['PHP_AUTH_USER'])) {
  header('WWW-Authenticate: Basic realm="Contabilita"');
  header('HTTP/1.0 401 Unauthorized');
  header("Cache-Control: no-store, no-cache, must-revalidate");
  echo "<h1>Accesso non consentito!</h1>";
  exit;
} else {
  if (!(("user1"==$_SERVER['PHP_AUTH_USER']) && ("password1"==$_SERVER['PHP_AUTH_PW']))) {
    echo "<h1>Accesso non consentito!</h1>";
    exit;
  };
};
Vorrei permettere anche a mia moglie ed eventualmente a qualche revisore di accedere ai dati, ma senza usare il mio id e la mia password e senza scomodare il database, cosi pensavo di usare il seguente pezzo di codice
if (!isset($_SERVER['PHP_AUTH_USER'])) {
  header('WWW-Authenticate: Basic realm="Contabilita"');
  header('HTTP/1.0 401 Unauthorized');
  header("Cache-Control: no-store, no-cache, must-revalidate");
  echo "<h1>Accesso non consentito!</h1>";
  exit;
} else {
  switch ($_SERVER['PHP_AUTH_USER']) {
    case "user1":
      if ("password1"==$_SERVER['PHP_AUTH_PW']) {
        $no_action = 1;
        $no_edit = 1;
      };
    break;
    case "user2":
      if ("password2"==$_SERVER['PHP_AUTH_PW']) {
        $no_action = 1;
        $no_edit = 0;
      };
    break;
    case "public":
      if ("admin"==$_SERVER['PHP_AUTH_PW']) {
        $no_action = 0;
        $no_edit = 0;
      };
    break;
    default:
      $no_action = 0;
      $no_edit = 0;
      echo "<h1>Accesso non consentito!</h1>";
      exit;
    break;
  };
};
ma non mi chiede niente ed entra direttamente.
Ho provato anche di eliminare la parte default del controllo switch ma non cambia nulla.
Sbaglio io a fare i controlli dei dati o non è la strada giusta?
Spero qualcuno mi consigli.
Grazie, PaoloS

    break;
Eh. Ma se il check fallisce, vale il break... ed entra direttamente.
Personalmente metterei gli utenti in un array:
	unset($no_action);
	if (isset($_SERVER['PHP_AUTH_USER'])
	&&  isset($_SERVER['PHP_AUTH_PW']))
	{
		$users = array(
			'user1'		=> 'password1:1:0',
			'user2' 	=> 'password2:0:0',
			'public'	=> 'admin:0:0',
		);
		$user = $_SERVER['PHP_AUTH_USER'];
		// Se l'utente e' noto
		if (isset($users[$user])
		{
			$data = explode(':', $users[$user]);
			// E la password e' giusta
			if ($_SERVER['PHP_AUTH_PW'] == $data[0])
				list($dummy,$no_action,$no_edit) = $data;
			// popoliamo no_action e no_edit
		}
	}
	// se no_action non e' popolato, vuol dire che...
	if (!isset($no_action))
	{
		// Manda gli header
		die('<h1>Accesso non consentito!</h1>');
	}
Leonardo
-- 
Geordie - he's a man, there's little doot about't,
He's done all he can, wha' can do withoot't?
Doon there cam a blade, linkin' like me lordie,
He wad drive a trade, a' the loom of Geordie.

Leonardo Serni ha scritto:

Grazie veramente.
Ci ho messo un po per capire l'iter, ma mi sembra molto buono.
Adesso lo provo.
Grazie di nuovo.
PaoloS

Leonardo Serni ha scritto:

Grazie Leonardo.
Funziona alla grande!...
ma č sorto un'altro problema.
Come faccio a "distruggere" l'utente precedente?
Cioč, dal computer si connette mia moglie, fa quel che deve, poi mi voglio connettere io, ma lo script pensa che sia ancora mia moglie.
Come faccio ad "uccidere" (hi hi hi!!) mia moglie? 8-) (Magari anche a farla franca? ;-))
Ho provato con 
unset($_SERVER['PHP_AUTH_USER']);
ma evidentemente non č la strada giusta.
Ancora grazie.
PaoloS 

Come faccio ad "uccidere" (hi hi hi!!) mia moglie? 8-) (Magari anche a farla franca? ;-))
Il problema e' che il browser si "ricorda" l'ultimo utente che ha
funzionato. Quindi occorre farglielo dimenticare; in genere, puoi
riuscirci cambiando (per finta) la password.
Per esempio, modificando
	if (isset($_SERVER['PHP_AUTH_USER'])
	&&  isset($_SERVER['PHP_AUTH_PW']))
	{
in
	if (isset($_SERVER['PHP_AUTH_USER'])
	&&  isset($_SERVER['PHP_AUTH_PW'])
	&& (
		(!isset($_REQUEST['logout']))
		||
		($_SERVER['PHP_AUTH_USER'] != $_REQUEST['logout']
	))
se chiami quella pagina con "logout=user1" l'autenticazione viene
ignorata finche' non cambi utente. Il browser, senza che tu possa
fermarlo, manda comunque user=user1; rimbalza; e, a questo punto,
ti propone di nuovo il login. Solo, ricordati che non potrai piu'
entrare due volte di fila con lo stesso utente... Se ti "slogghi"
per errore, devi chiudere il browser, oppure rientrare come altro
utente, risloggarti e ritornare a quello di prima.
C'era un sistema piu' furbo, pero' a quest'ora non me lo ricordo;
prova a cercare sul manuale PHP_AUTH_USER. O su Google.


 Leonardo
Ho risolto cancellando la cache del browser:
    header('Cache-Control: no-store, no-cache, must-revalidate');
L'avevo messo anche nel primo esempio, ma forse con le virgolette al posto degli apici non funzionava.
E l'ho spostato prima degli headers per l'autenticazione.
Adesso ad ogni riavvio del browser mi chiede user e password, e per ora mi basta.
Grazie ancora per l'aiuto.
Ciao.
PaoloS