Subversion/Redmineとの認証統合 のバックアップ(No.2) |
|
個人で使っているSubversionのRepository達を、全て、RedmineのProjectと関連付けて管理することにした。(中身はゴミ同然だけれど…)
そうなると、RedmineとSubversionの認証情報を統合できないか?ということになる。Subversion側の認証情報管理を省略したい。
例によって、Google先生に訊くと、
Apache HTTP Serverで行っているSubversionの認証処理を、Redmineに付属しているperl script(Redmine.pm)で置き換えればよい。
ということらしい。
ということで、以下の環境でやってみた。
結果、期待していた動作(RedmineのDBを参照して、Subversionが認証する)が実現できた。
まずは、httd.confから。
LimitRequestFieldSize 12392
#PerlRequire "C:/Server/Apache/conf/startup.pl
LoadModule perl_module modules/mod_perl.so
PerlLoadModule Apache::Authn::Redmine
<Location /svn>
LimitXMLRequestBody 0
# <IfModule mod_perl.c>
# AddHandler perl-script .pl
# PerlHandler ModPerl::Registry
# PerlOptions +ParseHeaders
# PerlSendHeader On
# LoadFile "C:/Server/Perl/bin/perl510.dll"
# </IfModule>
DAV svn
SVNParentPath "D:/Datas/svn"
SVNListParentPath on
SVNIndexXSLT "/svnindex/svnindex.xsl"
AuthType Basic
AuthName Subversion
#リポジトリの読み込みに必要なメソッド以外は認証を必要とする
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
PerlAccessHandler Apache::Authn::Redmine::access_handler
PerlAuthenHandler Apache::Authn::Redmine::authen_handler
## for mysql
RedmineDSN "DBI:mysql:database=redmine;host=127.0.0.1"
RedmineDbUser "********"
RedmineDbPass "********"
## Optional where clause (fulltext search would be slow and
## database dependant).
# RedmineDbWhereClause "and members.role_id IN (1,2)"
## Optional credentials cache size
# RedmineCacheCredsMax 50
</Location>
<IfModule mod_rewrite.c>
RewriteEngine On
# /svn -> /svn/ for SVNList view
RewriteCond %{REQUEST_URI} ^/svn$
RewriteRule ^/svn$ /svn/ [R=301,L]
# RewriteCond %{SERVER_PORT} !^443$
# RewriteRule ^(/svn/.*)?$ https://%{HTTP_HOST}$1 [L,R]
RewriteCond %{REQUEST_URI} ^/svn/Jomura\.FxCop\.Rules
RewriteRule ^/svn/Jomura\.FxCop\.Rules(.*)$ /svn/Jomura-FxCop-Rules$1 [R=301,L]
RewriteCond %{REQUEST_URI} ^/svn/Jomura\.Framework
RewriteRule ^/svn/Jomura\.Framework(.*)$ /svn/Jomura-Framework$1 [R=301,L]
</IfModule>
ポイント。
また、Redmine.pmも、1ヶ所だけ変更した。
200~203行目
before:
unless ($r->some_auth_required) {
$r->log_reason("No authentication has been configured");
return FORBIDDEN;
}
after:
unless ($r->some_auth_required) {
# $r->log_reason("No authentication has been configured");
# return FORBIDDEN;
return OK;
}
つまり、認証が定義されていない場合には、認証なしでsvn参照できるようにしたってこと。上記httd.confの<LimitExcept>の部分に対応。もしかしたらSecurity上の問題があるかもしれないと怯えつつ…
htpasswd認証と比較すると、性能的に多少遅いのかもしれないが、svn更新時だけなので全く気にならず。