svn 使用和 redmine 相同帳號進行認證

前言

話說專案控管軟體在軟體開發上常常配合著版本控管一起使用 , 如 Python 寫 Trac ,Ruby 寫的 Redmine 等都有 SVN 檔案庫瀏覽的功能 , 有玩過 SVN 的人應該會知道 SVN 可以搭配 Apache 一起使用 , 其實就我感覺最惱人的便是 SVN 上的使用者管理 , 之前我都是呆呆的用 htpasswd 建立密碼檔 , 但這有個問題 , 就是 SVN 的使用者要改密碼就必須透過我來改 , 當然了 , 也有現成的 Web Interface 軟體可以裝來針對 htpasswd 修改密碼 , 不過這對系統的複雜度就增加了

今天偶然想起 Apache 有 mod_auth_mysql 可以用 , 既然 Apache 可以使用 mysql 來做身分確認 , 那麼若把 mod_auth_mysql 參數設定成可以存取 Redmin 原本的使用者資料 , 那這樣任何參與專案開發的人就可直接上 Redmine 改密碼就好了 , 而且也可以做到對該使用者停權 , 都可以透過 Redmine 上的用戶管理介面來做 , 這樣可以簡化系統複雜度 , 也讓管理變得輕鬆 , 所以本篇就來好好介紹一下 mod_auth_mysql 的用法 .

準備工作

我的測試環境是 CentOS 5.5 64bit , 所以若 Apache 及 mod_dav_svn 都有裝好 , 只要再用 yum 去裝一下 mod_auth_mysql 即可 , 一開始要先分析一下 Redmine 的帳號表格的結構 , 這裡就不介紹甚麼是 Redmine 及安裝法了 , 我只是要拿 Redmine 的使用者表格結構做個範例 , 下表是 Redmine 中 users 資料表擷取部分欄位的結構及範例資料

id login hashed_password status type
1 admin d033112ae348aeb5660fc2ac0aec35850c33a997 1 User
2 pigo 48a8c85d03ekk512dab41f3d3182c23151e2f099 1 User
3 john 55a8c85d03e38512dab41f3g3182c23151e2f0b4 3 User

其中 login 為帳號名稱 , hashed_password 是以 SHA1 編碼過的密碼 , status = 1 代表狀態正常 , 其他就代表鎖定或其他問題 , type = User 時代表為用戶 , Redmine 中若 type = Group 是代表群組

大致了解了這個表之後 , 要讓 mod_auth_mysql 去檢查認證的規則就是 , status = 1 及 type = User , 雖然我不知道 mod_auth_mysql 是如何下 SQL 的 , 但我猜想 , 就是

SELECT * FROM users WHERE login='使用者輸入的帳號' AND status = '1' AND type = 'User'

這樣才有機會讓 mod_auth_mysql 抓到使用者資料 , 以上都是猜想 , 實際上要實作才知道

mod_auth_mysql 參數範例設定

假設 svn 的檔案都放到 /srv/www/svn , 而 CentOS httpd 本來有個 /etc/httpd/conf.d/subversion.conf , 我們就針對 subversion.conf 來做設定即可 , 以下就是我的範例

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so


<Location /repos>
   DAV svn
   SVNParentPath /srv/www/svn

   AuthType Basic
   AuthName "Authorization Realm"


   AuthMySQLEnable On
   AuthMySQLAuthoritative On
   AuthMySQLCharacterSet utf8
   AuthMySQLHost localhost
   AuthMySQLDB   redmine
   AuthMySQLUser redmine
   AuthMySQLPassword redminepass
   AuthMySQLPwEncryption sha1
   AuthMySQLUserTable users
   AuthMySQLNameField login
   AuthMySQLPasswordField hashed_password
   AuthMySQLNoPasswd Off

   AuthMySQLUserCondition " status = '1' and type = 'User' "

   AuthzSVNAccessFile /etc/httpd/conf/svn_authz.conf
   Require valid-user
</Location>

有很多參數對吧 , 稍微講一下意思應該不難

以上是基本的參數設定 , 但有一個參數沒有講到 , 就是 AuthMySQLUserCondition , 這個參數有點類似 SQL 中的 WHERE , 我們拉拉雜雜的設定了 Redmine 中的相關參數 , 但要讓 mod_auth_mysql 抓到正確的使用者就必須靠這個參數 , 如果說這個參數類似於 WHERE , 那麼就類似下面的 SQL 敘述

WHEE status = '1' and type = 'User' "

回去再看一下準備工作那個章節 , 應該會清楚我在說什麼 , 基本上就是 mod_auth_mysql 會根據上面一堆參數設定並組合成 SQL 字串後去 MySQL 抓取使用者表格中的資料來進行驗證

範例就到此結束 , 參數很多但不難理解 , 而這個範例只是讓大家知道 Apache 可以透過 mysql 來做認證 , 可以結合原本的專案管理軟體所使用的資料庫 , 只要稍微了解 SQL 語法 , 就不難去整合 , 而 SVN 還可以做到類似 ACL 的功能 , 我目前仍是用文字檔的方式做 , 也就是 AuthzSVNAccessFile 參數所指定的檔案 , 因為目前我還沒找到可以用資料庫來管理的方式 , 所以 ACL 部分仍是自己手動做 , 總是無法十全十美 ,  但是對於非管理者的人來說 , 能夠統一專案管理軟體及 SVN 帳號 ,  對他們來說已經是很方便了

Exit mobile version