PHP如何实现HTTP身份验证?

3

我真的不懂。 我不明白.htaccess、php和HTTP在http-authentication主题中是如何共同工作的。

如何实现这一目标:我有一个文件夹,我想防止未经授权的人访问。 在这个文件夹中,我有图片,例如,如果用户被授权,则应显示该图片,如果没有,他应该有可能为此请求输入用户名和密码。

我需要一个.htaccess文件吗?它将重定向到一个php文件,检查并处理认证,发送适当的头,并输出所请求的文件吗?

还是我需要做其他事情? 我需要完全用另一种方式解决这个问题吗?


对于简单的文件夹保护,您可以使用Apache的BasicAuth。但是对于复杂的应用程序,您不应该完全依赖文件系统,而应该仅在PHP中处理授权和身份验证。 - moonwave99
你本可以轻松地搜索它:http://www.howtoforge.com/htaccess_authentication - anubhava
1
这是二选一的问题。使用.htaccess,Apache处理授权弹出窗口和验证。PHP稍后只会看到已授权的用户名。但是PHP本身也可以编排401/Authorization握手。更常见的是,PHP脚本使用纯表单登录和会话状态,而不是HTTP授权。 - mario
3个回答

2
您有几个选项。
1- 基本认证 - 当用户发送请求时,Apache会检查htaccess文件,当设置了基本认证时,它会返回一个身份验证头(当没有发送登录信息时)。Web浏览器对此做出反应并提供本地登录屏幕。该屏幕得到所有浏览器和密码记忆工具的良好支持。在输入凭据时,下一次发送的请求将每次发送凭据(未加密),因此Apache不会每次提供登录屏幕。您可以在这里阅读更多相关信息。
如何设置它,请创建.htaccess文件:
AuthName "Protected"
AuthType Basic
AuthUserFile securepath/.htpasswd
Require user authuser

在命令行中创建 .htpasswd 文件:
$ adduser authuser
$ passwd authuser
$ htpasswd  -c securepath/.htpasswd  authuser

但是许多控制面板都有工具,可以使用界面来设置这一点。
2-自己的系统-您可以编写自己的身份验证系统,在您的代码中验证用户是否获得授权。您可以构建一个登录屏幕,在该屏幕上,用户被授权后会获得代表用户在您服务器上的 cookie。但是,cookie本身是未加密的,可以被他人读取。
后者为您提供了让用户更容易拥有不同密码的选项。而且密码不是每次都发送,只发送 cookie。
出于安全考虑,我建议使用 SSL/HTTPS 连接,其中所有内容都是加密的。

1
您可以使用基本身份验证(这可能是最容易设置的)来限制对整个文件夹的访问。 这相当直截了当。
您需要的第一件事是您的.htaccess文件。 该文件需要驻留在您要限制访问的文件夹内。 例如/restrict/.htaccess 这个.htaccess文件需要有
#set up basic authentication
AuthType Basic
#provide password verification file
AuthUserFile /PATH_TO_HTPASSWD_FILE/.htpasswd
#set user names as "require user *******"
require user my_username

然后在你的.htpasswd文件中,你可以像这样验证你的用户名/密码:

my_username:$1$jeTmJQpY$gKrWlJqL6dCCSX62Hspfp0

验证通过"用户名:密码" <<冒号分隔,密码可以以各种方式存储(crypt,明文,sha1,md5)。在上面的例子中,我选择了密码"password"并使用crypt作为输出。

强烈建议不要将.htpasswd文件存储在同一目录中。


这个很完美,但后来我在PHP中访问用户名时遇到了问题。$_SERVER['PHP_AUTH_USER']; 无法工作。 - K.I

1
  • 您需要配置服务器,在将请求传递给PHP之前执行身份验证 或者
  • 编写PHP代码,检查提交的凭据并返回适当的HTTP标头以请求它们(如果缺少或错误)

我需要一个.htaccess文件吗?

只有在使用上述第一种方法时才需要。即使如此,最好将配置放在主服务器配置中(更有效率)。

重定向到一个php文件

如果选择第二种方法,通常会在每个需要身份验证的页面顶部include您的身份验证代码。(对于简单的方法,MVC方法往往有更模块化的方式来处理事情)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接