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>

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

  • 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 帳號 ,  對他們來說已經是很方便了

4 則評論在 svn 使用和 redmine 相同帳號進行認證.

  1. 通告: 網站製作學習誌 » [Web] 連結分享

發佈留言