web上的一些内容不想被其他人知道,但是又想让部分人看到。nginx的http auth模块以及Apache http auth都是很好的解决方案。
1、基本认证
模块名称:ngx_http_auth_basic_module
该模块允许使用基于“HTTP基本认证”协议的用户名和密码对客户端访问请求进行控制。
密码文件格式如下:
# comment
name1:password1
name2:password2:comment # 明文文本
name3:password3
配置样例如下:
location / {
auth_basic "closed site"; # 认证提示
auth_basic_user_file conf.d/.ngxpasswd; # 认证密码文件conf.d/.ngxpasswd
}
当auth_basic的指令值为off时,可以对当前指令域取消来自上一层指令域的auth_basic配置。
htpasswd 是 Apache 提供的密码生成工具, nginx 也支持 auth_basic 模块,我们可以利用 htpasswd 命令生成账号密码文件提供给 nginx 使用。
安装
yum install -y httpd-tools
语法
htpasswd(选项)(参数)
选项
-c:创建一个加密文件
-n:不更新加密文件,只将加密后的用户名密码显示在屏幕上
-m:默认采用MD5算法对密码进行加密
-d:采用CRYPT算法对密码进行加密
-p:不对密码进行进行加密,即明文密码
-s:采用SHA算法对密码进行加密
-b:在命令行中一并输入用户名和密码而不是根据提示输入密码
-D:删除指定的用户
参数
用户:要创建或者更新密码的用户名
密码:用户的新密码
默认 .ngxpasswd 文件使用 md5 加密验证
常见操作
1、利用htpasswd命令添加用户
htpasswd .passwd -bc www.linuxde.net php
# 在bin目录下生成一个.passwd文件,用户名www.linuxde.net,密码:php,默认采用MD5加密方式
2、在原有密码文件中增加下一个用户
htpasswd .passwd -b Jack 123456
#去掉-c选项,即可在第一个用户之后添加第二个用户,依此类推。
3、不更新密码文件,只显示加密后的用户名和密码
htpasswd -nb Jack 123456
# 不更新.passwd文件,只在屏幕上输出用户名和经过加密后的密码
4、利用htpasswd命令删除用户名和密码
htpasswd .passwd -D Jack
5、利用htpasswd命令修改密码
htpasswd .passwd -D Jack
htpasswd .passwd -b Jack 123456
# 即先使用htpasswd删除命令删除指定用户,再利用htpasswd添加用户命令创建用户即可实现修改密码的功能。
2、认证转发
模块名称:ngx_http_auth_request_module
认证转发模块允许将认证请求转发给指定的服务器进行处理。启用认证转发后,会将认证需求以子请求的方式转发给指定的服务器,并通过子请求的返回结果判断客户端的认证授权。如果子请求返回响应码2××,则允许授权访问;若返回响应码401或403,则拒绝访问。
配置样例如下:
upstream member_server {
server 172.16.1.13:8080;
}
server {
listen 8080;
server_name localhost;
location / {
root /opt/nginx-web;
index index.html index.htm;
}
location /member {
auth_request /auth; # 启用认证转发到/auth
error_page 401 = @error401; # 认证若返回状态码401,则跳转到@error401
# auth_request_set $user $upstream_http_x_forwarded_user; # 将用户名赋予变量$user
# proxy_set_header X-Forwarded-User $user; # 将用户名传递给应用服务
proxy_pass http://member_server; # 代理转发到会员服务
}
location /auth {
internal;
proxy_set_header Host $host;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_pass http://172.16.10.14/auth; # 将认证信息转发到http://172.16.10.14/auth
}
location @error401 {
return 302 http://172.16.10.14/login; # 认证失败跳转到登录页
}
}
认证请求变量设置指令同样支持基本认证的转发。当客户端发起请求时,Nginx会将具有WWW-Authenticate的子请求头响应信息转发给客户端,提示用户输入账号、密码。用户的用户名和密码信息通过Base64编码后写在子请求的请求头中发送给认证请求的服务器,认证服务器解码后返回相应的响应状态码。配置样例如下:
server {
listen 8083;
server_name localhost;
root /opt/nginx-web;
auth_request /auth;
location / {
index index.html index.htm;
}
location /auth {
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
proxy_pass http://192.168.2.145:8080/HttpBasicAuth.php;
}
}
HttpBasicAuth.php的配置样例如下:
<?php
if(isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])){
$user = $_SERVER['PHP_AUTH_USERv];
$passwd = $_SERVER['PHP_AUTH_PW'];
if ($user == 'admin' && $passwd == v111111'){
return true;
}
}
header('WWW-Authenticate: Basic realm="BasicAuth Test"');
header('HTTP/1.0 401 Unauthorized');
?>
评论区