在 nginx 中使用 mysql 进行 http auth 用户认证
若干年前写过在 apache 中使用 mysql 进行 http auth 用户认证https://www.barhe.org/archives/147。若干年后,有了 nginx 的场景,大致的研究了下,记录如下。
以 debian 12 为例,先安装 nginx,然后再安装 libpam-mysql、libnginx-mod-http-auth-pam。
apt install nginx apt install libpam-mysql apt install libnginx-mod-http-auth-pam
安装好之后,写一个 pam 文件:
cat /etc/pam.d/nginx-auth-mysql auth required /usr/lib/x86_64-linux-gnu/security/pam_mysql.so user=db_user passwd=db_password host=localhost db=authdb table=users usercolumn=user_name passwdcolumn=user_password crypt=0 [where=host_group='nginx-test' and auth_by='nginx'] account required /usr/lib/x86_64-linux-gnu/security/pam_mysql.so user=db_user passwd=db_password host=localhost db=authdb table=users usercolumn=user_name passwdcolumn=user_password crypt=0 [where=host_group='nginx-test' and auth_by='nginx']
其中对应关系如下:
user: 连接数据库的用户名
passwd: 连接数据库的密码
host: 数据库地址
db: 数据库名
table: 表名
usercolumn: 表中的用户名字段
passwdcolumn: 表中的密码字段
crypt: 加密方式
where: 附加的验证条件
更详细的,可以看这儿:
https://github.com/NigelCunningham/pam-MySQL
然后修改 nginx 的站点文件,在 location 处加入如下内容:
# 设置为 on 的时候,启用 pam 模块认证。设置为 off 的时候,禁用 pam 认证 auth_pam on; # 在这引用 pam 的配置文件,默认在 /etc/pam.d/ 下面 auth_pam_service_name nginx-auth-mysql;
然后重启 nginx,再打开页面,确认没问题。