前言
話說專案控管軟體在軟體開發上常常配合著版本控管一起使用 , 如 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>
有很多參數對吧 , 稍微講一下意思應該不難
- AuthMySQLEnable On : 就是打開 mod_auth_mysql 認證功能了
- AuthMySQLAuthoritative On : 只使用 mod_auth_mysql 認證 , 因為有可能同一個 VirtualHost 中有其他認證 , 而好死不死瀏覽者也許通過其他種認證 , 反正這裡就是強制在 <Location /repos> 中一定要通過 mod_auth_mysql 認證啦
- AuthMySQLCharacterSet utf8 : 設定和 MySQL Server 連接時的字元編碼 , 這裡是 utf8 , 因為 Redmine 的設計就是以 utf8 來存放資料的
- AuthMySQLHost localhost : MySQL Server 的 hostname 或 ip , 這裡設定 localhost , 這代表 Apache 和 MySQL 是同一台
- AuthMySQLDB redmine : 設定 Database 名稱 , 我的 Redmine 也是用 redmine 這個名稱當資料庫名稱
- AuthMySQLUser redmine : 設定和 MySQL Server 連線時的 user name
- AuthMySQLPassword redminepass : 設定和 MySQL Server 連線時的密碼
- AuthMySQLPwEncryption sha1 : 設定密碼的加密方式 , 注意 ! 這裡就是指我的 redmine.users 表格存放密碼用甚麼來編碼的 , 而 Redmine 是 sha1 來編碼 , AuthMySQLPwEncryption 這個參數也支援常用的編碼方式 如 MD5 , Crypt 等
- AuthMySQLUserTable users : 設定用戶表格的名稱 , 在 Redmine 中就是 users
- AuthMySQLNameField login : 設定用戶表格中的帳號欄位名稱 , 在 Redmine 中是 login
- AuthMySQLPasswordField hashed_password : 設定用戶表格中的密碼欄位名稱 , Redmine 中是 hashed_password
- AuthMySQLNoPasswd Off : 禁止沒有密碼的認證 , 這裡稍微說一下 , 也許在其他的案例可能會讓密碼是空的 , 這裡只是強制一定要使用者輸入密碼才會進行認證
以上是基本的參數設定 , 但有一個參數沒有講到 , 就是 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 帳號 , 對他們來說已經是很方便了
通告: 網站製作學習誌 » [Web] 連結分享
maybe, u can try mod_authz_svn_db
.
http://christopher.wojno.com/2007/08/19/what-is-mod_authz_svn_db
@chliu
謝啦 , 這我有試過喔 ~ 不過我老是編譯不起來 , 所以也不趕提這東西 , 哈 , 不知道您有成功裝過嗎 ?
還沒有試過; 我自已也在找redmine整合subversion比較好solution; 不過我在官網有看一篇感覺上是比較完美解決方案。可參考看看
http://www.redmine.org/wiki/redmine/Repositories_access_control_with_apache_mod_dav_svn_and_mod_perl