Last-modified: 2011-08-23 (火) 19:25:22 (3551d)

 個人で使っている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

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>

 ポイント。

  1. 最終的には、startup.plもAddHandlerもLoadFileも必要なかった。(コメントアウト部分)
  2. 「どの版の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 フリー工房を拝見して、ようやく迷宮を脱出した感じ。
  3. AuthTypeに"Digest"を指定すると正しく認証されなかった。(そりゃそうか…) "Basic"のみ可。
  4. RedmineDbWhereClauseを使えば、「"committers"グループのユーザのみがsvn更新可能」設定ができる。
  5. Windows環境では、RedmineCacheCredsMaxが正常に動作しないのでは?
  6. BASIC認証なので、強制的にSSLへRedirectしようかとも思ったが、LANで使うこともあるし、コメントアウト(^^;;
    • しかし、Internet経由で職場から使う際はSSLが必須。Web-ProxyがいくつかのHTTP Methodを無効化するため、通常のHTTPでは"Bad Request"になってしまう。HTTPSだとOK。
  7. Redmine.pmを使う場合、RedmineのプロジェクトIDとsvnリポジトリ名を一致させる必要がある。今回は2つのリポジトリが改名の憂き目に遭った。なお、Windows環境では大文字・小文字の区別はない。(もし区別があったら、全リポジトリの改名が必要だった)
    • ちなみに、reposman.rb は使っていない。
 

 また、Redmine.pmも、1ヶ所だけ変更した。

Redmine.pm

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更新時だけなので全く気にならず。


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS