首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Debian 8 + Apache 2.4.x 部署基於 MySQL 認證的 Subversion (SVN) 服務

     編輯:Java 綜合教學

背景:Apache 2.2 → 2.4 認證模塊大變革

舊版 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 連接 MySQL

啟用必要模塊

a2enmod authn_dbd authz_dbd dbd dav_svn

執行後會在 /etc/apache2/mods-enabled/ 生成對應 .load/.conf 軟鏈接。

VirtualHost 配置詳解

<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>針對非列出方法(寫操作)啟用授權

多倉庫配置:SVNParentPath

<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 返回加密密碼並自動驗證。

常見問題排查

  1. 500 Internal Server Error:檢查 /var/log/apache2/error.log,通常是 DBD 連接失敗或 SQL 語法錯誤。
  2. 認證彈窗反複彈出:密碼查詢無結果、密碼哈希格式不匹配、數據庫連接超時。
  3. 權限不生效:Require 指令順序、Limit/LimitExcept 方法匹配、組查詢 SQL 返回值。
  4. 明文密碼風險:配置文件權限 chmod 640、屬主 root:www-data,或使用環境變量注入。

完成配置並 systemctl reload apache2 後,使用 svn checkout https://svn.example.com/svnprj 驗證,輸入數據庫用戶/密碼即可操作版本庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved