Apache 實現基本用戶身份驗證有多種方式,常見為文字檔和 DBM 格式,但在高負載伺服器上這些都不理想:文字檔基於平面搜尋,效能差且不安全;DBM 稍好但在千萬級用戶時仍力不從心。使用資料庫作為後端儲存是更好方法:比平面搜尋更有效且安全,用戶密碼以 DES 加密形式儲存在資料庫表中。
歸功於 Apache 優秀的模組化結構與開放的 DSO 機制,開發者可編寫第三方模組擴充功能。本文以 MySQL 為後端儲存,原理相同,亦可用 PostgreSQL、Oracle 等對應模組。
modules.apache.org 或 ftp://ftp.kcilink.com/pub/ 下載 mod_auth_mysql.c.gz,解壓得 mod_auth_mysql.c。apxs 產生 DSO 模組(前提是 Apache 採 DSO 模式編譯):
apxs -c -i -a -L/usr/local/lib/mysql -lmysqlclient -lm mod_auth_mysql.c
注意:-L/usr/local/lib/mysql 指定 MySQL 客戶端庫位置(假設為預設安裝),若不加此參數啟動 Apache 會報錯無法載入模組。
httpd.conf 應包含:
LoadModule mysql_auth_module libexec/mod_auth_mysql.so
AddModule mod_auth_mysql.c
重啟 Apache 應無問題。mysql> CREATE DATABASE auth;
mysql> USE auth;
mysql> CREATE TABLE mysql_auth (
user_name CHAR(20) NOT NULL,
user_passwd CHAR(25),
groups CHAR(25),
PRIMARY KEY (user_name)
);
注意:欄位名必須為 user_name 和 user_passwd。
插入測試資料(密碼用 ENCRYPT() 函數以 DES 算法加密,與 Unix password 等同,非 MySQL PASSWORD() 函數):
mysql> INSERT INTO mysql_auth VALUES ('xingfei2', ENCRYPT('abcde'), 'xingfei');
mysql> INSERT INTO mysql_auth VALUES ('xingfei', ENCRYPT('abcde'), 'xingfei');
在要保護的目錄建立 .htaccess(確保 AllowOverride All 已開啟):
AuthName "xingfei"
AuthType Basic
AuthMySQLHost localhost
AuthMySQLUser root
AuthMySQLPassword abc
AuthMySQLDB auth
AuthMySQLUserTable mysql_auth
AuthMySQLGroupField groups
Require group xingfei
Require user xingfei
可將用戶放在同一群組,只要是該群組用戶即可通過驗證,也可 Require 單一或多個用戶。