舊版 mod_auth_mysql 在 Apache 2.4 中已失效。新版採用 mod_authn_dbd(認證)+ mod_authz_dbd(授權)+ mod_dbd(連接池)組合,配置語法完全不同。
# Debian 8 (Jessie)
apt-get update
apt-get install apache2 libapache2-mod-svn mysql-client libaprutil1-dbd-mysql
libapache2-mod-svn:自動載入 dav_svn、authz_svn 等模塊libaprutil1-dbd-mysql:APR Util MySQL 驅動,支撐 mod_dbd 連接 MySQLa2enmod authn_dbd authz_dbd dbd dav_svn
執行後會在 /etc/apache2/mods-enabled/ 生成對應 .load/.conf 軟鏈接。
<VirtualHost *:80>
ServerName svn.example.com
DocumentRoot /var/www/svn
# === DBD 連接池配置 ===
DBDriver mysql
DBDParams "host=192.168.1.150 port=3306 dbname=svnauth user=authuser pass=dbpasswd"
DBDMin 4
DBDKeep 8
DBDMax 20
DBDExptime 300
# === 單倉庫配置 ===
<Location /svnprj>
DAV svn
SVNPath /var/svnlibs/svnprj # FSFS 倉庫路徑
SVNIndexXSLT /svnindex.xsl # 瀏覽器美化樣式
SVNAutoversioning on # WebDAV 自動版本控制
AuthName "Svnprj MySQL Auth"
AuthType Basic
AuthBasicProvider dbd # 指定認證來源為 DBD
Require valid-user
# --- 用戶認證查詢 ---
AuthDBDUserPWQuery "SELECT user_passwd FROM users WHERE user_name = %s"
# --- 寫權限:組授權 ---
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require dbd-group work
AuthzDBDQuery "SELECT user_group FROM groups WHERE user_name = %s"
</LimitExcept>
# --- 寫權限:特定用戶 ---
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require user admin_user
</LimitExcept>
# --- 讀權限:所有合法用戶 ---
<Limit GET PROPFIND OPTIONS REPORT>
Require valid-user
</Limit>
</Location>
</VirtualHost>
| 指令 | 作用 |
|---|---|
DBDriver mysql | 指定數據庫驅動 |
DBDParams | 連接字符串,含主機、端口、數據庫、用戶、明文密碼 |
DBDMin/Keep/Max/Exptime | 連接池參數:最小/保持/最大連接數、空閒超時(秒) |
AuthBasicProvider dbd | 啟用 DBD 認證提供者 |
AuthDBDUserPWQuery | 用戶密碼查詢 SQL,%s 替換為用戶名,需返回密碼列 |
Require dbd-group | 基於數據庫查詢的組授權 |
AuthzDBDQuery | 組成員查詢 SQL,返回用戶所屬組名 |
<LimitExcept> | 針對非列出方法(寫操作)啟用授權 |
<Location /svn>
DAV svn
SVNParentPath /var/svnlibs # 倉庫父目錄
SVNListParentPath on # 列出所有倉庫
# 其餘認證授權配置同單倉庫
</Location>
訪問 https://svn.example.com/svn/ 可瀏覽所有項目,/svn/project1 對應 /var/svnlibs/project1。
CREATE DATABASE svnauth DEFAULT CHARSET utf8;
CREATE TABLE users (
user_name VARCHAR(64) PRIMARY KEY,
user_passwd VARCHAR(128) NOT NULL -- 建議存儲加密哈希(如 SHA-256),Apache 會自動比對
);
CREATE TABLE groups (
user_name VARCHAR(64),
user_group VARCHAR(64),
PRIMARY KEY (user_name, user_group)
);
INSERT INTO users VALUES ('dev1', 'hashed_pass'), ('admin', 'hashed_pass');
INSERT INTO groups VALUES ('dev1', 'work'), ('admin', 'work');
安全提示:生產環境密碼列應存儲加密哈希,Apache mod_authn_dbd 支持 AuthDBDUserPWQuery 返回加密密碼並自動驗證。
/var/log/apache2/error.log,通常是 DBD 連接失敗或 SQL 語法錯誤。Require 指令順序、Limit/LimitExcept 方法匹配、組查詢 SQL 返回值。chmod 640、屬主 root:www-data,或使用環境變量注入。完成配置並 systemctl reload apache2 後,使用 svn checkout https://svn.example.com/svnprj 驗證,輸入數據庫用戶/密碼即可操作版本庫。