2013-08-06 30 views
1

我明白,沒有「真正的解決方案」註銷http,因爲它是無狀態的。不過,我需要的只是解決方法。我試圖實現的是當一個註銷鏈接被點擊時,它重定向到logout.php文件。該文件再次調用基本的auth頭文件。我想讓php代碼傳入一個假密碼,然後重定向到我的主頁,在那裏用戶將被「註銷」。PHP模擬一個註銷功能爲http基本認證

我意識到他們實際上不會被註銷,而是瀏覽器將嘗試使用最近傳遞的身份驗證憑據,這些憑據已傳入並且不正確,因此會使用戶重新登錄。

我基本上沒有PHP的經驗,並無法弄清楚如何編碼通過一個錯誤的密碼。

任何幫助表示讚賞。

logout.php

<?php 
    session_start(); 
    session_write_close(); 

    header('HTTP/1.1 401 Access Denied'); 
    header('WWW-Authenticate: Basic realm="HTTPS File Upload"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    header('Location: http://www.homepage.com') 
?> 
+0

你能解釋一下你爲什麼這麼做嗎?這似乎極其令人費解,因爲可能沒有很好的理由。順便提一下,HTTP認證信息存儲在cookie中。 – thatidiotguy

+0

你不能只是取消設置用戶認證的會話變量(如果你使用的話)? – bansi

+0

這是一個低容量頁面,其中有幾個用戶可以訪問並登錄,然後上傳文件以供我們訪問。目前,該網站根本沒有註銷功能,從網站基礎設施點看起來很糟糕。我不太瞭解有關php或http的信息,也不知道如何解決這個問題,看起來像一個似是而非的解決方法 – CPM

回答

1

此頁上的示例3可能接近您要查找的內容。

http://php.net/manual/en/features.http-auth.php

你可以採取不同的路線是實現PHP會話來代替。這是一個很好的基本閱讀。

http://phpmaster.com/php-sessions/

編輯 - 你並不需要強制憑證無效,如果你添加一個PHP會話(是的,你可以兼得)。即使你有唯一的會話變量是一個布爾$ _SESSION [「IsLoggedIn」]。使用上述變量,您可以將它添加到示例#3中的if語句中,如下所示,並通過logout.php腳本將它從會話中刪除。

if (!isset($_SESSION["IsLoggedIn"]) || !isset($_SERVER['PHP_AUTH_USER']) || 
    ($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) { 
    authenticate(); 
} else { 
    ... 
} 

並且不要忘記使用session_start();無論何時使用$ _SESSION變量,都會在頁面的頂部。

+0

無論如何最終編寫代碼,php.net對於PHP程序員來說都是無價的 –

+0

示例3非常接近,也許我應該將其重新命名爲,我已經成功地提出了重新認證窗口,並且想知道是否有一種方法來編寫可以自動填充該提示信息的錯誤信息?除非有人點擊瀏覽器上的後退按鈕,否則示例3將工作 – CPM

0

基本HTTP認證作品的每個請求傳遞一個用戶名/密碼。瀏覽器通常存儲憑據並在每個請求中傳遞它們,所以您的解決方案不能作爲服務器端,您必須找出一種方法告訴瀏覽器忘記憑據,如果可能的話。

+0

我對工作的理解我試圖讓我試圖讓瀏覽器使用錯誤的憑據。瀏覽器使用最近傳遞的證書,所以通過給它錯誤的證書,它使用它們並「忘記」以前正確的證書 – CPM

1

它的工作:

<?php 
if (!isset($_SERVER['PHP_AUTH_USER']) or isset($_POST['logout'])) { 
    header('WWW-Authenticate: Basic realm="My Realm"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    echo '<h1>Access Denied!</h1>'; 
    exit; 
} else { 
    if(!($_SERVER['PHP_AUTH_USER']=='admin' and md5($_SERVER['PHP_AUTH_PW'])=='d81edf2e48ddddddddd631e374c5932d')) 
    { 
     header('HTTP/1.0 401 Unauthorized'); 
     exit; 
    } 
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>"; 
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>"; 
} 
?> 


<html> 
<head> 
</head> 
<body> 
<form method="POST"> 
<button name="logout" type="submit">Log Out</button> 
</form> 

</body> 
</html> 
0

設置HTTP響應代碼:

401 

的響應頭必須包括:

WWW-Authenticate : Basic 

的用戶將被提示登錄當他們刷新。

P.S. Chromium瀏覽器將提示用戶只需從401代碼登錄,所以我會用IE進行測試。另外,隱私瀏覽模式是你的朋友。