20050729

使用MySQL为HTTP做认证

Author:  WinkCategories:  Linux, NetworksNo Comments »
Tags:  , ,
  • 作者: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。

下载与安装

下载mod_auth_mysql.tgz

$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才能做到)

图1

所以,通过这个方法就可以使用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.

Comments are closed.

Back to Page Top