傳統文字檔(平面搜尋效能差、不安全)與 DBM 格式(萬級用戶力不從心)在高負載下均表現不佳。採用 MySQL 等資料庫作為後端儲存,配合 DES 加密儲存密碼,兼具高效查詢與安全性。得益於 Apache 模組化 DSO 架構,第三方模組 mod_auth_mysql 可無縫擴充功能,同理支援 PostgreSQL、Oracle 等。
# 下載原始碼
wget ftp://ftp.kcilink.com/pub/mod_auth_mysql.c.gz
gunzip mod_auth_mysql.c.gz
# 以 DSO 方式編譯(假設 MySQL 客戶端庫在 /usr/local/lib/mysql)
apxs -c -i -a -L/usr/local/lib/mysql -lmysqlclient -lm mod_auth_mysql.c
關鍵參數:-L 指定 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)
);
# 密碼使用 UNIX crypt() (DES) 加密,非 MySQL PASSWORD()
mysql> INSERT INTO mysql_auth VALUES ('xingfei2', ENCRYPT('abcde'), 'xingfei');
mysql> INSERT INTO mysql_auth VALUES ('xingfei', ENCRYPT('abcde'), 'xingfei');
注意:欄位名必須為 user_name、user_passwd,密碼加密必須用 ENCRYPT()(相容 UNIX crypt),不可用 MySQL 內建 PASSWORD()。
AuthName "xingfei"
AuthType Basic
AuthMySQLHost localhost
AuthMySQLUser root
AuthMySQLPassword abc
AuthMySQLDB auth
AuthMySQLUserTable mysql_auth
AuthMySQLGroupField groups
require group xingfei
require user xingfei
支援群組與個別用戶混合驗證,AllowOverride All 須在主配置中開啟。