svn 集成 redmine 賬戶驗證的終極解決方案
動機
對於大部分開發團隊來說,一般都需要一套 SCM 系統,通常是 svn + redmine,有些還會有 reviewboard 之類的。
大家當然不希望上三套系統就有三套賬號密碼,那樣記憶起來太麻煩了,所以大家都希望有統一的驗證方案,當然,LDAP 是一種選擇,考慮到它部署起來比較難,成本比較高,一般會選擇統一使用其中某一個系統的賬戶驗證。
redmine 是沒有辦法使用 svn 的賬戶驗證的,所以大家只好選擇 svn 使用 redmine 的賬戶驗證。但是新版本 redmine 使用了 salt 字段加密,又是 sha1 算法計算 hMAC,所以 mod_auth_mysql 就掛了。網上能夠搜索到的一般有以下幾個方案:
1. 給 mod_auth_mysql 打補丁,見:http://www.redmine.org/boards/2/topics/24386?r=39269 。這個補丁在 Ubuntu Server 10.04 個工作得很好,但在 12.04 就不行了。
2. 改 redmine 的代碼,把 salt 機制幹掉,見:http://www.jiongsun.com/tag/mod_auth_mysql 。一般人不會選擇這種不能升級 redmine 的方案。3. 給 mod_auth_pgsql2 打補丁,再改 redmine 代碼,見:http://digzhu.com/redmine+postgresql+svn%20%E5%AE%9E%E7%8E%B0%E7%BB%9F%E4%B8%80%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86.html 。一種讓人蛋碎的方案。
顯然,需要一個不需要改代碼的終極解決方案。
另,因爲提供了 hook 機制,reviewboard 使用 redmine 的賬戶驗證倒是容易。
redmine-auth
redmine-auth 利用了 apache2 中提供的 AuthProvider 特性和 mod_wsgi WSGIAuthUserScript 特性,編寫了一個讀取 redmine 賬戶信息的腳本,實現賬戶驗證。
得益於 redmine-auth 使用了 sqlalchemy(從 0.2 版本開始),只要 sqlalchemy 支持的數據庫,redmine-auth 都可以讀取。所以無論 redmine 使用的是 MySQL 還是 postgresql,甚至是 oracle/mssql/sqlite,都可以無縫地使用 redmine-auth 進行賬戶驗證。
安裝
很簡單,運行使用:pip install -U redmine-auth
它會自動安裝依賴的程序庫,但是數據庫驅動需要你手動安裝,比如 MySQLdb 需要你自行安裝好。
配置
redmine-auth 提供了一個小程序用以生成 wsgi 驗證腳本,運行命令:redmine-auth -g /opt/redmine_auth.wsgi
回頭幾個關於 redmine 使用的數據庫相關的問題,一個可以運行的 wsgi 腳本就生成到指定的位置了。然後配置一下你的 apache2 site config 文件。讓它看起來像這樣:
<VirtualHost *:1081>
<Location />
DAV svn
SVNParentPath /opt/svn
AuthName "Subversion repository"
AuthType Basic
AuthBasicProvider wsgi
WSGIAuthUserScript /opt/redmine_auth.wsgi
AuthzSVNAccessFile /opt/svn-authz
Require valid-user
</Location>
</VirtualHost>
其中最重要的是下面這兩行:
AuthBasicProvider wsgi
WSGIAuthUserScript /opt/redmine_auth.wsgi
然後重啓你的 apache2 就可以了。