なにか作る

なにかを作るブログです。

SubversionでWindowsドメイン認証を行うときのあれこれ

 Subversion の話にイマドキどれだけの需要があるのかわからないけど書くよ。

 Apache 2.2 を使う前提の話です。

Windows ドメイン認証をする

 最初から入っている mod_authnz_ldap でも LDAP 認証はできるようなんだけれど、ユーザー名とパスワードをアクセス時に入力する必要があるようだ。ユーザー名とパスワードの入力なしに、ドメインにログインしている情報によって認証を行うには mod-auth-sspi モジュールを使用するという手がある*1。インストール方法は zip ファイルをダウンロードして展開した中の doc/INSTALL ファイルに書かれているので、ここでは詳述しない。

コミットした人のユーザー名をわかりやすい名前に変更したい

 会社のドメインなんかだと、社員番号がユーザー名として使われているみたいなことが結構多いんじゃないだろうか。この場合、Subversion リポジトリのコミットの際にもこのユーザー名が使用されてしまうので、誰がコミットしたのかが非常に分かりづらい。これを解決するのにはフックスクリプトが使える。

post-commit.bat

REM 
REM users.txt に記述された内容に従って、コミットを行ったユーザーの名前を社員番号からローマ字名に変換します。
REM 

SET REPOS=%1
SER REV=%2
SET REPOS_URL=file:///%REPOS:\=/%
SET USERS_FILE=C:\repository\svn\users.txt

REM 変更者の取得
FOR /F "usebackq" %%i in (`svnlook author %REPOS% -r %REV%`) do SET AUTHOR=%%i

REM 変更者をローマ字に変更する
REM /F "TOKENS=1,2" %%I IN (%USER_FILE%) DO (
  IF %AUTHOR%==%%I (
    svn propset svn:author --revprop -r %REV% %%J %REPOS_URL%
    EXIT 0
  )
)

pre-revprop-change.bat

REM propset を行うのに必要
exit 0

users.txt

0000000001 suzuki
0000000002 sato
0000000003 takahashi

フックスクリプト*2リポジトリディレクトリー内の hooks ディレクトリー内に配置する。

リポジトリ内のアクセス制御をユーザーごとにパスベースで行いたい

 これはちょっと難しい。mod_authz_svn を使うのがひとつの手段。

1.Subversion インストールディレクトリの bin/mod_authz_svn.so を Apache インストールディレクトリの modules ディレクトリ内にコピーする。 2.httpd.conf に以下の行を追加する。

LoadModule authz_svn_module modules/mod_authz_svn.so

3.同ファイルに AuthzSVNAccessFile ディレクティブを追加する。以下のような設定になる。

<Location /svn/test>
  DAV svn
  SVNPath C:\repository\svn\tsample
  SSLRequireSSL
  SVNReposName "サンプルリポジトリ"

  # Windows ドメイン認証の社員番号を元に AuthzSVNAccessFile で権限制御を行う。
  AuthName "Sample Domain"
  AuthType SSPI
  SSPIAuth On
  SSPIAuthoritative On
  SSPIDomain Sample
  SSPIOmitDomain On

 # 実際には AuthzSVNAccessFile を使用した時点でこの設定は無効化されている
  Require valid-user

  Order allow,deny
  Allow from all

  AuthzSVNAccessFile "C:\repository\svn\sample\conf\authz"
</Location>

4.authz ファイルで細かなアクセス許可を設定する。以下一例。

[aliases]
suzuki = 0000000001
sato = 0000000002
takahashi = 0000000003

[groups]
members = &suzuki,&sato
developers = &takahashi

[/]
@members = r
@developers = rw

 ただ残念ながら mod_auth_sspi と mod_authz_svn は基本的に併用不可。無理に併用したこの設定では認証が無効になってしまい、すべてのユーザーがアクセス可能となってしまっている。ただし、authz ファイルで読み取り権限が与えられていない限り、リポジトリの内容を読み取ることは不可能。これで一応要件を満たしてる。

*1:EclipseSubversive では、SVN クライアントに SVNKit ではなく Native JavaHL を選ぶ必要があった。ユーザー名とパスワードは空欄にすること。SVNKit だとパスワードの入力を求められた。

*2:このフックスクリプトについては詳述されているサイトがあまり無い…。