用Apache+MySQL做网页身份验证
- 发布
- 更新
- 字数
- 1727
- 阅读
- 4 分钟
一般用于网页做身份验证的使用的方法是在网页文件夹添加一个.htaccess文件,然后按如下步骤来进行:
假设我们要对网站根目录下边的test目录进行身份验证,在一般情况下,我们需要进行如下操作:
- 修改httpd.conf配置文件,添加如下内容:
Alias /test "/usr/local/wwww/apache22/data/test"
Options Indexes MultiViews
AllowOverride AuthConfig #表示进行身份验证
Order allow,deny
Allow from all- 在/usr/local/wwww/apache22/data/test下创建.htaccess文件,文件内容如下:
more /usr/local/wwww/apache22/data/test/.htaccessAuthName "Barhe's Share"
AuthType Basic
AuthUserFile /usr/local/wwww/apache22/data/test/.htpasswd
require valid-user3)创建验证用户barhe
#首次创建用户需要用 -c 参数,第2次添加用户就不用
htpasswd -c /usr/local/wwww/apache22/data/test/.htpasswd barhe#如果想改密码,可如下
htpasswd -m .htpasswd barhe4)重新启动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存在兼容性问题.两者无法正常配合使用…
评论
正在载入评论…