使用PHP的HTTP身份验证究竟是如何工作的?

使用PHP的HTTP身份验证究竟是如何工作的?,php,.htaccess,http-authentication,Php,.htaccess,Http Authentication,我真的不明白。 我不明白.htaccess、php和HTTP在主题HTTP身份验证中是如何协同工作的 如何做到这一点:我有一个文件夹,我想防止未经授权的人访问。 例如,在这个文件夹中我有图像,如果用户被授权,图像应该显示出来,如果没有,他应该可以为这个请求输入用户名和密码 我是否需要一个.htaccess文件,它重定向到一个php文件,检查和处理身份验证,发送适当的头文件,并输出请求的文件 还是我必须做点别的? 我要解决的问题完全不同吗? 将服务器配置为在将请求传递给PHP或服务器之前执行身份验

我真的不明白。 我不明白.htaccess、php和HTTP在主题HTTP身份验证中是如何协同工作的

如何做到这一点:我有一个文件夹,我想防止未经授权的人访问。 例如,在这个文件夹中我有图像,如果用户被授权,图像应该显示出来,如果没有,他应该可以为这个请求输入用户名和密码

我是否需要一个.htaccess文件,它重定向到一个php文件,检查和处理身份验证,发送适当的头文件,并输出请求的文件

还是我必须做点别的? 我要解决的问题完全不同吗?

  • 将服务器配置为在将请求传递给PHP或服务器之前执行身份验证
  • 您编写的PHP将检查提交的凭据,并返回适当的HTTP头,以请求它们是否丢失或错误
我需要一个.htaccess文件吗

仅当您使用上述第一种方法时。即使如此,您通常还是最好将配置放在主服务器配置中(这样效率更高)

它重定向到一个php文件


如果使用第二种方法,通常会在需要验证的每个页面的顶部包含验证代码。(无论如何,对于一种简单的方法,MVC方法往往有一种更模块化的方法来做事情)。

您有一些选择

1--当用户发出请求时,apache会检查htaccess文件,当设置了基本身份验证时,它会返回一个用于身份验证的头(当没有发送登录信息时)。webbrowser对此作出反应,并给出本机登录屏幕。所有浏览器和密码记忆工具都非常支持此屏幕。每次输入凭据时,下一个请求都会发送凭据(未加密),因此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连接。

您可以使用基本身份验证限制对整个文件夹的访问(这可能是最容易设置的)。这相当直截了当

您首先需要的是.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

验证由“用户名:密码”完成,用于简单的文件夹保护,您可以使用。但对于一个复杂的应用程序,你根本不应该依赖文件系统,你应该只使用PHP处理授权和身份验证。使用.htaccess时,Apache处理授权弹出窗口和验证。PHP稍后只会看到授权用户名。但是PHP本身可以协调握手。更常见的是,PHP脚本使用普通形式的登录和会话状态,而不是HTTP授权。这非常好用,但是我后来在PHP中访问用户名时遇到了问题$_服务器['PHP_AUTH_USER'];行不通。