目 录CONTENT

文章目录

Nginx访问认证

简中仙
2022-09-07 / 0 评论 / 0 点赞 / 47 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2023-10-07,若内容或图片失效,请留言反馈。 本文如有错误或者侵权的地方,欢迎您批评指正!

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'); 
 
?>
0

评论区