|
個人で使っているSubversionのRepository達を、全て、RedmineのProjectと関連付けて管理することにした。(中身はゴミ同然だけれど…) そうなると、''RedmineとSubversionの認証情報を統合できないか?''ということになる。Subversion側の認証情報管理を省略したい。 例によって、Google先生に訊くと、 > Apache HTTP Serverで行っているSubversionの認証処理を、Redmineに付属しているperl script(Redmine.pm)で置き換えればよい。 ということらしい。 ということで、以下の環境でやってみた。 - Windows XP Professional SP3 32-bit (on VMware Server 2) - Apache HTTP Server 2.2.19 - Subversion 1.6.17 - ActivePerl 5.10 - Redmine 1.2.1 - MySQL 5.5.12 結果、期待していた動作(RedmineのDBを参照して、Subversionが認証する)が実現できた。 まずは、httd.confから。 *** httpd-svn.conf [#s557f86f] 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" SVNPathAuthz off # http://www.redmine.org/boards/2/topics/7593 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;mysql_connect_timeout=30" RedmineDbUser "********" RedmineDbPass "********" ## Optional where clause (fulltext search would be slow and ## database dependant). RedmineDbWhereClause "and exists (select * from groups_users where users.id = groups_users.user_id and groups_users.group_id = (select id from users where type = 'Group' and lastname = 'committers'));" ## 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> ポイント。 + 最終的には、startup.plもAddHandlerもLoadFileも必要なかった。(コメントアウト部分) + 「どの版のmod_perl.soを使うか」の試行錯誤にもっとも時間がかかった。 -- 「mod_perl-2.0がApache2.0用。mod_perlがApache2.2用」(namingからはわかりません(++)) -- 「ActivePerl-5.12系、5.10系、5.8系で、それぞれmod_perlは別」(そりゃそうなんだろうけど、そんな区別の無い配布サイトの多いこと…) -- キレイに情報がまとまっている [[Mod_Perl フリー工房:http://mod_perl-free.topsite.ne.jp/MOD_PERL/]]を拝見して、ようやく迷宮を脱出した感じ。 + AuthTypeに"Digest"を指定すると正しく認証されなかった。(そりゃそうか…) "Basic"のみ可。 + RedmineDbWhereClauseを使えば、「"committers"グループのユーザのみがsvn更新可能」設定ができる。 + Windows環境では、RedmineCacheCredsMaxが正常に動作しないのでは? + BASIC認証なので、強制的にSSLへRedirectしようかとも思ったが、LANで使うこともあるし、コメントアウト(^^;; -- しかし、Internet経由で職場から使う際はSSLが必須。Web-ProxyがいくつかのHTTP Methodを無効化するため、通常のHTTPでは"Bad Request"になってしまう。HTTPSだとOK。 + Redmine.pmを使う場合、RedmineのプロジェクトIDとsvnリポジトリ名を一致させる必要がある。今回は2つのリポジトリが改名の憂き目に遭った。なお、Windows環境では大文字・小文字の区別はない。(もし区別があったら、全リポジトリの改名が必要だった) -- ちなみに、reposman.rb は使っていない。 #br また、Redmine.pmも、1ヶ所だけ変更した。 *** Redmine.pm [#adce3acc] 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上の問題があるかもしれないと怯えつつ… #br htpasswd認証と比較すると、性能的に多少遅いのかもしれないが、svn更新時だけなので全く気にならず。