主頁 回到教程 在線幫助

如何在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查詢錯誤.