本文适用于Apache 2.1及更高版本,低版本请先更新或查阅其他教程。
一、原理
首先知道HTTP认证的原理,当客户端访问服务器资源时,如果服务器需要先对客户端身份进行认证,那么服务器将会返回响应状态码401,其含义为Unauthorized,即:未被授权;并在响应标头中(即:WWW-Authenticate)提供具体的验证方法(方法一般有:Basic,即基本认证方法;Digest,即MD5摘要认证方法等)。客户端根据此方法来进行身份验证,验证通过即可访问服务器资源。具体原理,请前往此页面进行学习:HTTP身份验证原理
二、修改apache2.conf全局配置文件
那么,如何在Apache2中使用认证方法呢?我把链接放在这里,可以自学,也可以听我细说:Apache2认证模块介绍
安装Apache2什么的就不多说了,我默认大家已经安装好了Apache2,并创建好了自己的网站,且网站能够正常访问。
例如,我们的网站根目录路径,如下面的代码块所示。我们将通过设置,让所有试图访问该目录下的子目录和子文件的客户端接受认证模块的考验,只有通过才能访问。
/disk_0/web/www/example.com/root
我们进入apache2的全局配置文件存放目录,打开名为apache2.conf的配置文件:
sudo vim /etc/apache2/apache2.conf
在这个配置文件中,我们找到下面这个代码块:
# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all denied
</Directory>
#<Directory /srv/>
# Options Indexes FollowSymLinks
# AllowOverride None
# Require all granted
这里描述了不同目录对访问服务器的客户端所开放的权限。我们首先将我们自己的网站根目录加入到上面去,并为它添加各项属性,稍后我会逐一介绍它们,重要的参数我会加粗标示:
<Directory /disk_0/web/www/example.com/root>
Options Indexes FollowSymLinks
AuthName "authorization"
AuthType basic
AuthBasicProvider file
AuthUserFile /disk_0/web/www/example.com/authorization/users
Require valid-user
AllowOverride None
</Directory>
- Option:决定客户端是否能看见我们的网站目录,这里不详细结介绍
- AuthName:认证提示信息,写啥都行,主要是起提示作用
- AuthType:认证类型,即上文提到的Basic和Digest等,目前Apache2好像就支持这两种
- AuthBasicProvider:Basic认证支持模块,用来为Basic认证方法提供支持,如果你在前面的AuthType中选择了Basic认证方式,那么你要在这里进一步设置支持方式。我们这里使用的是文件支持
- AuthUserFile:设定一个纯文本文件的名称,其中包含用于认证的用户名/密码的列表,这个文件就是用来支持Basic认证方法的
- Require:规定谁能够访问本目录
- AllowOverride:规定.htaccess文件对本目录权限的复写操作,与本文没太大关系,不介绍
三、加载auth_basic、auth_file模块
接下来,由于我们使用Basic方法,以文件形式支持该方法进行鉴权,我们需要在Aapache2中启动相应的模块。
sudo a2enmod auth_basic
sudo a2enmod auth_file
注意,如果你没有执行上述指令,当你重启apache2服务时,apache2会提示你,你使用了basic认证方法,但没有加载该方法依赖的所有模块。
四、创建用户
在apache2.conf文件中,我们为我们网站的根目录曾输入了如下代码:
AuthUserFile /disk_0/web/www/example.com/authorization/users
这是存储用户名和密码的文本文件,我们使用htpasswd指令新建一个用户:
htpasswd -c /disk_0/web/www/example.com/authorization/users user_0
指令将在/disk_0/web/www/example.com/authorization/目录下创建一个名为users的纯文本文件,并新建一个名为user_0的新用户,按下回车,系统会提示你输入该用户的密码(为了保证不出错,会让你输入两遍)。成功后,你可以打开这个纯文本文件看一下,里面存储的是用户名以及经过加密的用户密码:
user_0:$amb1$s2234421$B50124
请特别注意!!!创建的纯文本文件绝对不能位于网站根目录下面,因为访问者有可能会直接看到这个文件,然后下载它,虽然密码是经过加密的,但这样做仍然很危险!
五、重启Apache2服务
输入指令重启Apache2服务:
sudo systemctl reload apache2
如果没有任何返回信息,说明服务启动成功,我们来看一下实际效果吧。
六、结果
如果我们点了取消,服务器会返回浏览器401码