2013-08-06 34 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进行测试。另外,隐私浏览模式是你的朋友。