2010-08-16 17 views
5

Birisi bir "çıkış" isteğinde gönderirse, otomatik olarak "başarılı çıkış" diyerek bir sayfaya götürür. Müşteri geri düğmesine basmayı veya kısıtlı alana gitmeyi denerse, HTTP tekrarlamasını isteyecektir.PHP: HTTP Basic - Oturumu Kapat

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 

kullanıcı başarılı ziyaretler example.com/logout.php örnek eğer

Ne var bugüne kadar budur. com/restricted/index.php? logout erişilebilir. Kullanıcı geri dönmeye çalıştığında, ancak rastgele şeyler gerçekleştiğinde, bazen iki kez HTTP kimlik doğrulaması isteyecektir (???), bazen bir döngüde (?) Kimlik doğrulamasını sormaya devam edecektir ve bazen sanki hemen geri dönmeme izin verecektir. Ben hiç çıkmadım.

Oturumların nasıl çalıştığı konusunda yeniyim, fakat benim anlayışım şudur: Kişi doğrulandığında// doğrulandığında, oturumda bir değişken saklar. çıkış yaptıktan sonra, o oturum değişkenini siler ve logout.php'ye geri döner ... Neden o zaman indekse geri tıkladığımda, oturum [login] varsayılan olarak ayarlanmadığı zaman, kimlik doğrulama sormadan geri dönmeme neden olur .

Bu PHP kodunda herhangi bir gelişme takdir edilmektedir. HTTP Basic kullanmamalı ve SQL'i içermem gerektiğini biliyorum, ama meh. Bu geçici bir çözümdür.

Düzenleme: Talimatlar içeren bir örnek varsa, MySQL ile bir çözümü kabul edeceğim. Hiçbir MySQL veya PHP veritabanı bilgisine sahip (henüz)

+1

Oturumlar olmadan, en iyi seçiminiz temel bölge dizesini değiştirmek. – stillstanding

+0

Sadece geçici bir çözüm için bu kadar çaba göstermiyor mu? –

+0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Oturum açmış bir kullanıcıdan gelen çağrıyı ve oturumu kapatılmış bir kişiden gelen çağrıyı nasıl ayırt edersiniz :) –

cevap

1

bir kaba bir fikir sizi başlatmak için: Ben onun etrafında bir yol bulduk

<?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

PHP_AUTH_USER ve PHP_AUTH_PW dosyalarını ayrıştırma ve .htpass olmadan nasıl doğrularım? – ParoX

+0

Geçici bir çözümse ve yalnızca bir kullanıcı adı/parola kümesine ihtiyacınız varsa, sadece bir şey yapın: if ($ _SERVER ['PHP_AUTH_USER']! = 'TheUsername' || $ _SERVER ['PHP_AUTH_PW']!= 'ThePassword') {/ * 401 Error & Exit * /} else {$ _SESSION ['login'] = true} ' Şahsen, daha önce PHP_AUTH_USER/PHP_AUTH_PW kullanmamıştım, sadece bana geçen bir formum var. Kullanıcı adı ve Şifre $ _GET veya $ _POST - Çok daha basit. –

+0

@Brian giriş yapıp db'ye geçsin mi? –

1

.

Ben 2 dosyaları var: index.php ve logout.php İşte

benim 'index.php' kod şudur: Burada

# 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>'); 
} 

Ve 'çıkış olduğunu .php 'code:

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

http-equiv="refresh" meta etiketini çok kısa bir yanıt süresiyle kullanabilirsiniz (ör. content="1"). Bu yenileme herhangi bir $_POST temizleyecektir.

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(); 
}