主页 回到教程 在线帮助

如何在Xlight FTP服务器使用数据库存储过程

Xlight FTP服务器可以配置使用数据库存储过程认证ftp用户. 它提供了灵活性以集成Xlight FTP服务器到其他类型数据库应.

在我们开始存储过程指南之前, 我们需要解释一些关于ODBC功能如何在Xlight FTP服务器内部运作.

Xlight FTP服务器使用2个数据库表存储用户设置. Xlight FTP服务器ODBC功能最主要的表是"acct_table", 它存储一个用户基本的设置, 例如host_id, host_port, 用户名, 口令和他的组, 主目录和主目录权限等. 第二个表是"acct_param_table", 由在"acct_table"查询返回的"param_index"列做索引. 它存储用户的其他设置, 这些设置可以作为所有用户的参数模板.

当用户登录到FTP服务器, Xlight FTP服务器里将发送二次SQL查询到这个数据库, 验证他的口令和获得他的设置. 第一次SQL查询用这个用户名和口令, 在数据库查找符合记录, 并且获得基本的参数, 例如"home_path", "home_perm"等. 第一次SQL查询返回的"param_index"值为索引将用于第二次SQL查询. 如果第一次SQL查询不返回"param_index", Xlight FTP服务器将不会发送第二次SQL查询. 第二次SQL查询将查询数据库表“acct_param_table”获得此用户的更多参数.

在Xlight FTP服务器使用数据库存储过程

许多数据库系统支持存储过程. 我们使用MySQL数据库作为例子. 使用MySQL之前, 你必须下载最新的 MySQL ODBC Driver - 3.51.16 或者更高版本. 否则,因为MySQL的Bug #27544, 第二次SQL查询将会失败. 其他类型的数据库,你也最好升级数据库相应的ODBC Driver到最新版本.

在使用存储过程之前必须设置数据库ODBC数据源. 你可以参考这里的设置步骤.

在本例中, 我们有一个表"account_info"在这个数据库里. 此表是其他数据库应用程序所使用, 它存储用户名, 口令和用户发表的文章数目(posts). 我们也创建了另一个表"acct_param_table", 它是Xlight FTP服务器中的一张数据库表, 用于存储用户参数. 我们没有创建Xlight FTP服务器的主要数据库表"acct_table ", 因为我们将使用存储过程模拟其功能.

account_info
AccountPasswordPosts
test1test1_password20
test2test2_password120
test3test3_password300
acct_param_table
param_indexmax_down_speed
010
150
2100

下面代码是范例MySQL存储过程test () ,它接受2个参数, username_inpassword_in.

DELIMITER $$
DROP PROCEDURE IF EXISTS test $$
CREATE PROCEDURE test(username_in VARCHAR(65), password_in VARCHAR(65))
main: BEGIN
  DECLARE user_name VARCHAR(65);
  DECLARE home_path VARCHAR(255);
  DECLARE home_perm VARCHAR(10);
  DECLARE num_posts, param_index INT(10);

  SELECT `account`, `Posts`
    INTO user_name, num_posts
    FROM account_info
    WHERE account = username_in AND password = password_in;

  IF user_name != username_in THEN
    LEAVE main;
  END IF;

  SET home_perm = 'LRS';

  IF num_posts > 100 THEN
    SET param_index = 1;
    SET home_path = 'c:\\folder_1';
  ELSEIF num_posts > 200 THEN
    SET param_index = 2;
    SET home_path = 'c:\\folder_2';
  ELSE
    SET param_index = 0;
    SET home_path = 'c:\\folder_0';
  END IF;

  SELECT home_path,home_perm,param_index;

END $$
DELIMITER ;

存储过程test()接受明码文本口令的password_in参数. 你必须为虚拟服务器配置ODBC使用明码文本口令, 如下图所示


上面的存储过程test()将检查数据库account_info验证用户, 如果用户名或口令不符合, 将没有结果集返回Xlight FTP服务器,这个用户的验证将失败.

在成功的用户认证以后, 这个程序将根据用户在"account_info"表里发表的文章数目(posts), 返回不同的param_index, home_path值. 最终test()程序将用语句"SELECT home_path,home_perm,param_index;"返回结果集到Xlight FTP服务器.

因为test()程序替换"acct_table"的功能, 您应该放置"call test('$USER','$PASS');"在选项"替换第一条内部SQL查询语句"中,如下图所示.


$USER$PASS是预定义参数, Xlight FTP服务期将用登录用户实际的用户名和密码自动替换它们. 如果需要查询支持的预定义参数, 请查阅帮助手册的[全局选项]->[高级]这一节.

如果您想要解决数据库查询的问题,你可以选择这个选项"在系统错误日志显示跟踪调试信息",你将能在系统错误日志中看到SQL查询错误.