用Apache+MySQL做网页身份验证
一般用于网页做身份验证的使用的方法是在网页文件夹添加一个.htaccess文件,然后按如下步骤来进行:
假设我们要对网站根目录下边的test目录进行身份验证,在一般情况下,我们需要进行如下操作:
1) 修改httpd.conf配置文件,添加如下内容:
Alias /test "/usr/local/wwww/apache22/data/test" Options Indexes MultiViews AllowOverride AuthConfig #表示进行身份验证 Order allow,deny Allow from all
2) 在/usr/local/wwww/apache22/data/test下创建.htaccess文件,文件内容如下:
more /usr/local/wwww/apache22/data/test/.htaccess
AuthName "Barhe's Share" AuthType Basic AuthUserFile /usr/local/wwww/apache22/data/test/.htpasswd require valid-user
3)创建验证用户barhe
#首次创建用户需要用 -c 参数,第2次添加用户就不用 htpasswd -c /usr/local/wwww/apache22/data/test/.htpasswd barhe
#如果想改密码,可如下 htpasswd -m .htpasswd barhe
4)重新启动apache以生效你的更改
/usr/local/etc/rc.d/apache22 restart
这样,当你打开 http://www.mysite.com/test/ 的时候,就会弹出一个对话框要求你输入用户名和密码,验证通过之后,才可以访问.
象这种基于网页的身份验证,在用户数量较少的情况下,使用比较方便,但如果是用户数量很多,甚至上百万的,这样的认证方式显然就不适合了.
我们可以使用apache+mysql+mod_auth_mysql的方式来进行相关的验证.
mod_auth_mysql的主页是http://www.heuer.org/mod_auth_mysql/
假设我们已经安装好了apache和mysql server,那么我们需要继续安装mod_auth_mysql:
安装方法如下:
# 这里边要选mod_auth_mysql2,mod_auth_mysql是针对apache1.3.x的好象... cd /usr/ports/www/mod_auth_mysql2 & make install clean
安装完毕之后,可以参照http://www.heuer.org/mod_auth_mysql/htpasswd.sql里边的内容,在数据库中建议用于认证的数据表,当然你也可以按自己的喜好对数据表中的字段名进行变更.
如下就是我们自定义的表的结构(跟mod_auth_mysql官网上边的并不完全相同):
# # Table structure for table `host_info` # CREATE TABLE `host_info` ( `host_id` int(11) NOT NULL AUTO_INCREMENT, `host` char(50) COLLATE utf8_unicode_ci NOT NULL, `host_group` char(50) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`host_id`) ) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; # -------------------------------------------------------- # # Table structure for table `groups` # CREATE TABLE `groups` ( `group_id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NULL, `group_name` char(50) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`group_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; # -------------------------------------------------------- # # Table structure for table `users` # 这个示例中,因为我做的验证项目是一个ftp+apache+ie的上传下载系统,为了保证跟ie编码的兼容性,我们在部分字段尤其是涉及到目录名称的字段上,使用了gb2312的编码 # CREATE TABLE `users` ( `user_id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NULL, `gid` int(11) NOT NULL, `user_name` char(20) CHARACTER SET gb2312 NOT NULL, `user_group` char(50) CHARACTER SET gb2312 NOT NULL, `user_password` char(120) CHARACTER SET gb2312 NOT NULL, `host_group` char(50) CHARACTER SET gb2312 NOT NULL, `auth_by` char(20) CHARACTER SET gb2312 NOT NULL, `user_pw` char(50) CHARACTER SET gb2312 NOT NULL, `ftp_dir` char(150) CHARACTER SET gb2312 NOT NULL, `user_dir` char(150) CHARACTER SET gb2312 NOT NULL, `exceed_date` date NOT NULL, `user_disable` smallint(1) NOT NULL, `user_mail` char(50) COLLATE utf8_unicode_ci NOT NULL, `upload_enable` smallint(1) NOT NULL, `is_admin` smallint(1) NOT NULL, `user_always_effective` smallint(1) NOT NULL, PRIMARY KEY (`user_id`) ) ENGINE=MyISAM AUTO_INCREMENT=383 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
数据表生成完毕之后,修改apache的配置文件httpd.conf,将相关验证的内容加入进去.
假如我们要对http://www.mysite.com/test/这个地址进行基于mysql的身份验证,我们需要添加如下内容:
<Directory '/usr/local/wwww/apache22/data/test/'> Options None AllowOverride None Order allow,deny Allow from all # AuthName "Barhe's Share" AuthType Basic require valid-user AuthUserFile /dev/null AuthMySQLEnable On # mysql服务器地址 AuthMySQLHost mysqlserverid # 连接mysql服务器的用户名 AuthMySQLUser mysqluser # 连接mysql服务器的用户密码 AuthMySQLPassword mysqluserpassword # 用于身份验证的数据库名 AuthMySQLDB authdb # 用于身份验证的用户表名 AuthMySQLUserTable users # 用于身份验证的用户表的用户名字段 AuthMySQLTableUserName user_name # 用于身份验证的用户表的用户密码字段 AuthMySQLTableUserPasswd user_password # 身份验证的条件,我们可以用SQL语句写一个适合自己的验证条件,下边的语句意思即是:host_group是mysite并且user_group是barhe或test并且用户在有效期内并且用户没有被禁用. AuthMySQLUserQueryCondition "users.host_group='mysite' and (users.user_group='barhe' or users.user_group='test') and users.exceed_date>=date(now()) and users.user_disable=0" AuthBasicAuthoritative Off # </Directory>
然后就是往mysql的表里边添加相应内容了.
在这里,需要我们注意的是,users表中的user_password字段采用的是mysql的encrypt()来进行加密的.详情可以参见mysql中有关encrypt()的介绍.
为了保证安全性,我们应当为encrypt()使用一个更为随机和不确定的salt参数.如:
#使用明文密码的第一位和最后一位作为salt参数 encrypt('yourpassword','yd')
至此,使用有关使用apache+mysql+mod_auth_mysql来进行多用户身份验证的步骤全部完成.
Edit(2014-02-16):
经过测试,apache2.4与mod_auth_mysql存在兼容性问题.两者无法正常配合使用…
写的不错,按楼主的笔记我也设置好了!