使用MySQL为HTTP做认证
- 作者:abel
- 原载:CHINAUNIX
一般使用Apache的认证,相信大多数人都使用.htaccess+htpasswd的方式,这种方式唯一的缺点多是你无法从网页管理介面去增删改user,即使有方法也会比较费事,而mod_auth_mysql则提供了从MySQL的table来做认证,更增加了系统的弹性。不过由于Apache有两种版本1.3.x及2.x,而这两个版本的DSO的hook API不同,所以mod_auth_mysql也就有编译/安装即有两种版本,以下分别依序介绍1.3.x及2.x。
下载与安装
$wget http://heanet.dl.sourceforge.net/sourceforge/modauthmysql/mod_auth_mysql-3.0.0.tar.gz
$tar -zxvf mod_auth_mysql-3.0.0.tar.gz
$cd mod_auth_mysql-3.0.0
请注意这个tar包有autoconf也有Makefile,要仔细看一下“BUILD/README/CONFIGURE”的说明,以了解安装过程,其主要则是以apxs程序来产生DSO文件。
Apache 1.3.x的做法
1. 编译DSO
$apxs -c -lmysqlclient -lm -lz mod_auth_mysql.c -L/usr/lib/mysql -I/usr/include/mysql
2. 安装DSO
$apxs -i mod_auth_mysql.so
3. 设定1.3.x的httpd.conf中的部份
LoadModule mysql_auth_module modules/mod_auth_mysql.so
AddModule mod_auth_mysql.c
Apache 2.x的做法
1. 编译DSO
$/www/bin/apxs -c -L/usr/lib/mysql -I/usr/include/mysql -lmysqlclient -lm -lz mod_auth_mysql.c
2. 安装DSO
$apxs -i mod_auth_mysql.so
3. 设定2.x的httpd.conf中的部份
LoadModule mysql_auth_module modules/mod_auth_mysql.so
设定.htaccess 组态(如果用的mod_auth_mysql版本太旧,设法稍有不同,请详见CONFIGURE):
# 网页的.htaccess 设定(也可以设在httpd.conf中)
# 使用mod_auth_mysql(on),如果不使用可用off
AuthMySQLEnable On
# Mysql IP或hostname
AuthMySQLHost Hostname
# Mysql Listen的port
AuthMySQLPort 3306
# 登入MySQL的帐号
AuthMySQLUser ID
# 密码
AuthMySQLPassword Password
# 数据库名称
AuthMySQLDB users
# 使用那个 table 做认证的来源
AuthMySQLUserTable table_name
# 条件,例如where userid>10,则下方的条件式为userid>10
AuthMySQLUserCondition = "userid>10"
# 使用该table中哪个栏位当username
AuthMySQlNameField username
# 使用该table中哪个栏位当密码栏位
AuthMySQLPasswordField password
# 可选择下列密码编码方式
# none: not encrypted (plain text)
# crypt: UNIX crypt() encryption
# scrambled: MySQL PASSWORD encryption
# md5: MD5 hashing
# aes: Advanced Encryption Standard (AES) encryption
# sha1: Secure Hash Algorihm (SHA1)
# 一般UNIX/Linux系统都使用crypt为主,而phpbb论坛则使用md5
AuthMySQLPwEncryption crypt
# 群组table,如果不设则同AuthMySQLUserTable所指table
AuthMySQLGroupTable table_name
# 条件,例如where group=admin,则下方的条件式为
AuthMySQLGroupCondition = "group='admin'"
# 群组table中的哪个栏位做群组名称
AuthMySQLGroupField
# 是否保持Mysql Connection,Off不保持,On保持
AuthMySQLKeepAlive Off
# 如果mod_auth_mysql认证不通过,是否使用巳定义的其它认证(ex: mod_auth)
# On表示仅使用mod_auth_mysql,Off则表示如果MySQL认证失败,仍可使用其它定义的认证方式
AuthMySQLAuthoritative Off
require valid-user
#require group xxx
上述的很多功能可用可不用,完全看个人需要,另外,该DSO有一些文件没有写好,以3.0版来说,有的功能巳经换或拿掉了(Ex: AuthMySQLNoPassword),但文件里还有提及,这个部份建议自己多实验,多体会。
我自己用的内容:
AuthName "Mysql Admin"
AuthType Basic
AuthMySQLEnable On
AuthMySQLHost IP
AuthMySQLPort 3306
AuthMySQLUser ID
AuthMySQLPassword password
AuthMySQLDB users
AuthMySQLUserTable user
AuthMySQLNameField user_name
AuthMySQLPasswordField password
AuthMySQLPwEncryption crypt
AuthMySQLAuthoritative On
# 有些网页要限制人或群组时,可加上名字或群组名称
require valid-user abel
require valid-group admin
我的数据库结构,这个结构就是Unix account的结构,passwd/shadow的内容,因为我将所有的帐号资料都存在MySQL,我所管理几十台的机器帐号都使用此一认证来源(每台机器有不同的where条件,这个功能需要libnss_mysql+pam_mysql才能做到)

所以,通过这个方法就可以使用HTTP Authorization的机制来做管控,而不用使用session/cookie方式,再写一个可以修改table的cgi/php程序,就可以让user自己改个人资料了,其它网页则完全不用检查session或cookie是否存在,就按照一般的开发程序来写,不用检查是否登录因为Apache会先要求其登入,才可存取网页或图片。
现在高度发挥所有的认证皆源于MySQL的资料,只要懂得原理及工具,就很容易发挥单一认证来源的控管,避免的帐号的零散及管理的困难。
You can follow any responses to this entry through the RSS 2.0 feed. Responses are currently closed, but you can trackback from your own site.