主頁 回到教程 在線幫助

如何使用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"的[細節]-[連接]-[字符集]中編碼要設為BIG5.


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地址替換