2010-08-16 6 views
5

Je voudrais le configurer où si quelqu'un envoie une demande "déconnexion", il les emmènera automatiquement à une page disant "déconnexion réussie". Si le client essaie d'appuyer sur le bouton de retour ou d'accéder à la zone restreinte, il demandera de nouveau l'authentification HTTP.PHP: HTTP Basic - Déconnectez-vous

Ce que j'ai à ce jour est la suivante:

example.com/restricted/index.php:

<?php 
    session_start(); 

    if(isset($_GET['logout'])) 
    { 
     unset($_SESSION["login"]); 
     header("location: ../logout.php"); 
     exit; 
    } 

    if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || !isset($_SESSION["login"])) 
    { 

     header("HTTP/1.0 401 Unauthorized"); 
     header("WWW-authenticate: Basic realm=\"Tets\""); 
     header("Content-type: text/html"); 
     $_SESSION["login"] = true; 
     // Print HTML that a password is required 
     exit; 
    } 
?> 
// The rest of the page is then displayed like normal 

Les visites réussies utilisateur de example.com/logout.php~~number=plural si exemple. com/restricted/index.php? logout est accédé. Quand l'utilisateur essaye de revenir en arrière cependant des choses aléatoires arrivent, parfois il demandera l'authentification HTTP deux fois (???), parfois il continuera à demander l'authentification dans une boucle (?) Et parfois il me laissera retourner juste comme si Je ne me suis jamais déconnecté. Je suis nouveau dans la façon dont les sessions fonctionnent mais ma compréhension est la suivante: Si/quand la personne est validée, elle stocke une variable dans sa session appelée login avec une valeur true ... si elle reçoit une requête GET avec déconnectez-vous, il va alors supprimer cette variable de session et revenir à logout.php ... Pourquoi est-ce alors quand je clique de nouveau à l'index me laissera-t-il me revenir sans demander l'authentification, quand la session [login] n'est pas supposée .

Toute amélioration de ce code PHP est appréciée. Je sais que je ne devrais pas utiliser HTTP Basic et devrait incorporer SQL, mais meh. Ceci est une solution temporaire.

Editer: Je vais accepter une solution avec MySQL si un exemple avec des instructions sont inclus. Je ne connais pas de base de données MySQL ou PHP (encore)

+1

Sans sessions, le mieux est de changer la chaîne de domaine de base. – stillstanding

+0

N'est-ce pas tant d'efforts pour une solution temporaire? –

+0

@stillstanding le problème principal est QUAND l'envoyer. Comment distinguer un appel d'un utilisateur connecté et un appel d'un utilisateur déconnecté :) –

Répondre

1

Une vague idée de vous lancer:

<?php 
    session_start(); 

    if(isset($_GET['logout'])) 
    { 
    session_destroy(); 
    header('Location: ../logout.php'); 
    exit; 
    } 

    if(!isset($_SESSION['login'])) 
    { 
    if(!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) 
    { 
     header("HTTP/1.0 401 Unauthorized"); 
     header("WWW-authenticate: Basic realm=\"Tets\""); 
     header("Content-type: text/html"); 
     // Print HTML that a password is required 
     exit; 
    } 
    else 
    { 
     // Validate the $_SERVER['PHP_AUTH_USER'] & $_SERVER['PHP_AUTH_PW'] 
     if($_SERVER['PHP_AUTH_USER']!='TheUsername' 
      || $_SERVER['PHP_AUTH_PW']!='ThePassword') 
     { 
     // Invalid: 401 Error & Exit 
     header("HTTP/1.0 401 Unauthorized"); 
     header("WWW-authenticate: Basic realm=\"Tets\""); 
     header("Content-type: text/html"); 
     // Print HTML that a username or password is not valid 
     exit; 
     } 
     else 
     { 
     // Valid 
     $_SESSION['login']=true; 
     } 
    } 
    } 
?> 
// The rest of the page is then displayed like normal 
+0

Comment valider PHP_AUTH_USER et PHP_AUTH_PW sans analyser et .htpass et tel? – ParoX

+0

S'il s'agit d'une solution temporaire, et que vous avez seulement besoin d'un nom d'utilisateur/mot de passe, faites quelque chose comme 'if ($ _SERVER ['PHP_AUTH_USER']! = 'TheUsername' || $ _SERVER ['PHP_AUTH_PW']!= 'ThePassword') {/ * 401 Error & Exit * /} else {$ _SESSION ['login'] = true} ' Personnellement, je n'ai pas utilisé PHP_AUTH_USER/PHP_AUTH_PW auparavant, j'ai tendance à avoir un formulaire qui me passe leur nom d'utilisateur et mot de passe par $ _GET ou $ _POST - Beaucoup plus simple. –

+0

@Brian enregistrer login et passer dans le db? –

1

J'ai trouvé un moyen de contourner.

J'ai 2 fichiers: index.php et logout.php

Voici mon 'index.php' code:

# CHECK LOGIN. 
if (!isset($_SESSION["loged"])) { 
    $_SESSION["loged"] = false; 
} else { 
    if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) { 
     if (($_SERVER['PHP_AUTH_USER'] == L_USER) && (md5($_SERVER['PHP_AUTH_PW']) == L_PASS)) { 
      $_SESSION["loged"] = true; 
     } 
    } 
} 
if ($_SESSION["loged"] === false) { 
    header('WWW-Authenticate: Basic realm="Need authorization"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    die('<br /><br /> 
    <div style="text-align:center;"> 
     <h1 style="color:gray; margin-top:-30px;">Need authorization</h1> 
    </div>'); 
} 

Et voici mon 'fermeture de session .php 'code:

session_start(); 
$_SESSION["loged"] = false; // We can't use unset($_SESSION) when using HTTP_AUTH. 
session_destroy(); 
0

Vous pouvez utiliser la méta-étiquette http-equiv="refresh" avec un temps de réponse très court (par ex. content="1"). Cette actualisation effacera tout $_POST.

if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER']!='myusername' || $_SERVER['PHP_AUTH_PW']!='mypassword' || isset($_POST['logout'])) { 
    header('WWW-Authenticate: Basic realm="My protected area"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    echo '<html><head><title>401 Unauthorized</title><meta http-equiv="refresh" content="1"></head><body><h1>401 Unauthorized</h1><p>You are not allowed to see this page. Reload the page to try again.</p></body></html>'; 
    exit(); 
}