主页 回到教程 在线帮助

如何使用Xlight FTP服务器的ODBC外部用户数据库功能

Xlight FTP服务器可以使用外部的用户数据库获得用户参数.注意: 只有专业版本的Xlight FTP服务器有这个功能, 用户在30-天试用期也可以试用这个功能.使用外部用户数据库方便系统管理员管理大量用户.

使用外部用户数据库需要配置ODBC数据源. 下面以MySQL数据库为例. 对于其他数据库,设置方法很类似.

使用这个功能之前, 你首先需要设置ODBC数据源.

1. MySQL ODBC数据源可以在网址http://www.mysql.com/downloads/api-myodbc.html下载.在运行Xlight FTP服务器的机器上安装MySQL ODBC数据源.

2. 安装完mysql ODBC数据源后你需要到Windows"控制面板-管理工具"中在"系统DSN"标签内添加MySQL数据源.

3. 选择"系统DSN"内的"添加(D)..."按键,选择"MySQL ODBC Driver",按"完成"按键.

4. 在这个例子里, 我们使用 "Xlight FTP Server" 作为数据源名字. 你可以使用任何数据源名字. 这里假定MySQL数据库在远端192.168.11.2的LINUX服务器上. 我们现要在其中创建一个名字是"ftp_user_db"的空数据库. 这里你可以使用任何数据库名字. 在机器192.168.11.2上, 在MySQL命令提示符 mysql>, 键入命令"create database ftpd_user_db;" 创建一个名字是 "ftpd_user_db" 的数据库. 如果你需要在数据库中使用中文字符集,在"MySQL ODBC Driver"的[细节]-[连接]-[字符集]中编码要设为GB2312.


5. 你需要在Xlight FTP服务器的 [全局选项]->[高级]->[ODBC 数据库设置] 中配置外部数据库". 你需要填入数据库用户和密码,以及ODBC数据源. 如果你想手工创建数据库表, 你可以跳到步骤 7. 在这个例子里,我们假定数据库用户"test"对数据库"ftpd_user_db"有完全的访问权限. 你可以点击"创建"键,让Xlight FTP服务器替你在数据库里创建需要的数据库.你也可以点击"测试"键,检查你是否已正确创建数据表.
注意: 对于64bit系统, 你需要用32bit ODBC管理程序设置DNS. 32bit ODBC管理程序在C:\Windows\sysWOW64\odbcad32.exe. 具体原因可以查看 http://support.microsoft.com/kb/942976.


6. 通过ODBC使用外部用户数据库认证, 你需要到 [虚拟服务器设置]->[通用]->[虚拟服务器], 选择选项"启用外部用户鉴权" . 单击"设置..."键, 在虚拟服务器的"鉴权类型" 中必须选择ODBC, 如下图所示:


7. 这个步骤只是用于手工创建数据库表. 如果你已经在第5步完成数据库表的创建,你可以忽略这个步骤. 手工创建数据库表,在数据库中需要两个表: acct_table and acct_param_table. 你可以在Xlight FTP服务器的安装目录中的odbc目录下找到文件 "odbc_tables.sql". 你可以用这个文件手工创建数据库表.

8. 为了安全的数据库访问, 创建上面两个表之后, 你可以在数据库中创建一个只读用户,他对"ftp_user_db"的数据库只有SELECT的权限,如下所示:

在MySQL命令提示符 mysql>, 键入命令 grant select on ftpd_user_db.* [email protected]'192.168.11.%' Identified by "ftpd"; 这里你创建了一个新的数据库用户"anon",他的密码是"ftpd",他对数据库"ftpd_user_db"只有SELECT的访问权限. 这个命令也限制用来查询数据库的访问只能来自网段"192.168.11.0". 然后你可以将Xlight FTP服务器的外部ODBC数据库配置中的用户和密码改成这个只读用户.

现在你完成了ODBC设置步骤. ODBC功能是在每个虚拟服务器中单独启用的. 在同一个Xlight FTP服务器,你可以有一些虚拟服务器使用ODBC外部用户数据库, 而一些不使用. 如果你选择选项 "忽略 host_id 列" 或 "忽略 host_port 列", 在数据库查询时, Xlight FTP服务器将会忽略 "host_id" 或 "host_port" 列. 因为 "host_id" 列可以用来表示不同的机器, 而 "host_port" 列可以用来表示在同一台机器上的不同的虚拟服务器. 这两个选项可以用来在不同运行Xlight FTP服务器的机器间共享用户数据库,也可以在同一个机器的不同虚拟服务器间共享用户数据库. 如果你只用数据库鉴权用户, 你可以选择选项 "只检查用户名和密码", 使用这个选项你需要在本地FTP服务器创建同名的用户. 数据库只是用来检查用户存在数据库中的密码. 当这个选项启用, 所有的用户设置都是从本地服务器中同名的用户设置里获得.

在数据库中创建用户

你可以使用外部的数据库工具连接到数据库并创建用户. 这只是用于测试目的.

在实际的生产环境里, 你可以使用 PHP 或 其他 CGI 脚本创建基于网页的界面,用于添加,删除或允许用户通过网页更改密码等等.这种方式便于管理大量的用户.你也可以和你现有的数据库应用结合. 因为Xlight FTP服务器只需要读取用户数据库, 但不写入用户数据库, 你不需要担心和你其他数据库应用冲突.

在数据库创建用户之前, 你最好先阅读 Xlight 帮助文档中, "ODBC 数据库表结构" 这一节.

用户的密码可以是以 MD5/SHA1 Hash或明码的形式存放在数据库. 默认是使用MD5 hash. 你可以在虚拟服务器的外部用户认证,ODBC设置中更改密码类型. 如果使用 MD5 hash, 你可以通过搜索"MD5 calculator" 很容易在Google找到MD5计算的工具. 在我们的例子里用户名是 "test" 他的密码也是 "test" , 密码的MD5 hash值是"098f6bcd4621d373cade4e832627b4f6". 如下图所示:


注意: 如果用户的主目录不存在, 当他第一次登录时, Xlight FTP服务器会自动在本地创建目录. 例如, 当用户名是"test" 的主目录"c:\wutemp"不存在. 当这个名字是"test"的用户登录时, Xlight FTP服务器会自动为他创建这个目录.

如果你想使用更多的用户参数, 你可以在数据表 "acct_param_table" 中创建 "param_index" 列. 在这一行中填入你想使用的参数, 并且将这个参数放到这个用户在"acct_table"表中的"param_index"列. 列"param_index"的值可以在不同用户间共享, 因此如果你有很多用户有同样的参数, 在数据表 "acct_param_table" 中你不需要创建很多不同的"param_index"行.


对于你不使用的数据库表中的那些列, 你可以让它们的值为空. 但列 "host_id", "host_port", "username" 是必须的值, 你必须填写. 另外如果使用"home_path"列,"home_perm"列也必须填写.

"virtual_path_table" 被用来设置用户的虚拟目录. 一个用户在数据库中可以有多个虚拟目录. 这些虚拟目录在"virtual_path_table"表中有不同或相同的"virtual_path_index". 在"acct_table"中的"virtual_path_indexes"列通过"virtual_path_index"列链接到"virtual_path_table"的一个或多个行. 如果他包含多个"virtual_path_index", 它们之间必须通过","(逗号)分隔.


参数%username%可以用于"virtual_path_table"里的real path. %username%将会被替换成实际登录的用户名. 如果用户登录时real path不存在, Xlight FTP服务器将会自动创建目录.

查找并解决数据库认证问题

通过选中选项"在错误日志显示调试跟踪信息",可以帮助你查找并解决数据库认证的问题,这个选项可以在[虚拟服务器设置]->[启用外部用户鉴权]找到. 启用这个选项后, 你可以在错误日志看到Xlight FTP服务器数据库查询过程.

使用其他数据库

当用户登录Xlight服务器时,服务器会通过ODBC连接,用SQL语句分两次查询数据库。

第一个数据库的SQL查询用于在数据库中找到与用户登录时输入的用户名,密码相匹配的纪录,并且获得关于这个用户的一些基本配置参数,如"home_path", "home_perm" 等等. 在这次查询中返回的"param_index"值将会同时用在第二次数据库查询。

第二次数据库的SQL查询将会用第一次查询返回的"param_index"值,查询数据库的"acct_param_table",以得到更多的用户参 数设置。

Xlight服务器使用的"acct_table"和"acct_param_table"数据库表可以不实际存在与数据库里. Xlight服务器并不知道"acct_table"和"acct_param_table"是否存在于数据库中. 它只是通过察看两个SQL查询的返回结果. 如果第一条SQL查询替换语句从数据库中返回一行, Xlight服务器就认为用户登录验证成功,同时它会从返回的行中,获得用户的基本配置参数. 如果数据库没有返回结果,它认为用户登录验证失败。 所以数据库如果不想让用户访问服务器,就不要返回SQL查询结果. 在第一条查询返回的"param_index"值,将会用在第二条SQL查询语句中.

Xlight服务器允许管理员替换上面两个SQL查询语句,以支持高级的数据库应用,如数据库的"存储过程"(Stored Procedure), 你可以看这个例子如何使用数据库存储过程

替换第一条内部SQL查询语句 - 在第一条SQL替换语句中,可以使用下面的变量:

$USER - 这个变量将以用户的登录名替换
$PASS - 这个变量将以用户的密码(MD5或Text)替换
$ID - 这个变量将以"本地主机ID"替换
$PORT - 这个变量将以虚拟服务器的端口替换
$USERIP - 这个变量将以用户的IP地址替换
$SERVERIP - 这个变量将以虚拟服务器的IP地址替换

例如, 如果用语句 "EXEC proc_getuser '$USER', '$PASS', $ID, $PORT" 作为第一条SQL语句的替换, 当用户是"test"的用户以密码"hello"登录到FTP服务器21端口, 本地主机ID是1, 经过替换最后送到数据库的SQL语句是 "EXEC proc_getuser 'test', 'hello', 21, 0".

替换第二条内部SQL查询语句 - 在第二条SQL替换语句中,可以使用下面的变量:

$INDEX - 这个变量将会替换为第一条SQL替换查询语句返回的"param_index"值.
$PORT - 这个变量将以虚拟服务器的端口替换
$SERVERIP - 这个变量将以虚拟服务器的IP地址替换