2010-08-16 87 views
5

我會設置它,如果有人發送請求「註銷」它會自動帶他們到一個頁面,說「成功註銷」。如果客戶試圖按下後退按鈕或去限制區域,它會再次要求HTTP認證。PHP:HTTP基本 - 註銷

我到目前爲止是這樣的:

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 

用戶成功訪問example.com/logout.php如果例子。 com/restricted/index.php?logout被訪問。當用戶嘗試返回時發生隨機事件時,有時它會要求HTTP認證兩次(???),有時它會一直要求循環(?)中的認證,有時它會讓我馬上回去,好像是我從未註銷。

我是新來的會議如何工作,但我的理解是這樣的:如果/當人被驗證,它存儲一個變量在它的會話稱爲登錄與值爲真...如果它獲得GET請求與註銷,然後它會刪除該會話變量,並返回到logout.php ...爲什麼當我點擊回索引它會讓我回到沒有要求身份驗證,當會議[登錄]應該沒有設置。

對此PHP代碼的任何改進表示讚賞。我知道我不應該使用HTTP Basic,而應該合併SQL,但是meh。這是一個臨時解決方案。

編輯:如果包含指令示例,我將接受MySQL解決方案。我沒有MySQL或PHP數據庫知識(還)

+1

沒有會話,你最好的選擇就是改變基本的字符串。 – stillstanding 2010-08-16 04:50:33

+0

僅僅是一個臨時的解決方案,不是很努力嗎? – 2010-08-16 04:54:48

+0

@暫時的主要問題是什麼時候發送它。如何區分來自登錄用戶的呼叫和來自登出用戶的呼叫:) – 2010-08-16 04:56:54

回答

1

一個粗略的想法,開始你:

<?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和PHP_AUTH_PW而不解析和.htpass等? – ParoX 2010-08-16 05:02:00

+0

如果是臨時解決方案,並且只需要一組用戶名/密碼,只需執行一些操作即可:if($ _SERVER ['PHP_AUTH_USER']!='TheUsername'|| || $ _SERVER ['PHP_AUTH_PW']!='ThePassword'){/ * 401 Error&Exit * /} else {$ _SESSION ['login'] = true}' 個人而言,我以前沒有使用過PHP_AUTH_USER/PHP_AUTH_PW,我傾向於只有一張表格,他們的用戶名和密碼通過$ _GET或$ _POST - 更簡單。 – 2010-08-16 05:07:59

+0

@Brian保存登錄並傳入數據庫? – 2010-08-16 05:09:33

1

我已經找到辦法解決它。

我有2個文件:的index.phplogout.php

這裏是我的 '的index.php' 代碼:

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

這裏是我的'註銷.php'code:

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

您可以使用元標記http-equiv="refresh",其響應時間非常短(例如, content="1")。此刷新將清除任何$_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(); 
}