複数プロジェクトのtracでプロジェクト、ページごとの詳細なアクセス制限

TracEnvParentDirでまとめてホストしていると、digest認証のファイルが共通になる。けど、各tracページへのアクセス制限はそれぞれ特定のユーザでのみ行いたい。そんなとき。ちょっと調べた。

前提

tracのparentdirへのアクセスごとdigest認証をしている

<Location /trac/>
  SetHandler    mod_python
  PythonHandler trac.web.modpython_frontend
  PythonOption  TracEnvParentDir   /path/to/tracroot
  PythonOption  PYTHON_EGG_CACHE   /tmp
  PythonOption  TracUriRoot        /trac

  AuthType Digest
  AuthName auth
  AuthUserFile   /path/to/.htdigest
  Require valid-user
</Location>

wikiは見られてもいいけど、リポジトリは見せたくない場合の設定

digest認証のファイルを一つにまとめてるので、1つのユーザで認証が通れば他のtracリポジトリも見れるようになる。
ex)
apacheでdigest認証のファイルを一つに書いているので

  • .htdigest
hoge:realm:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
fuga:realm:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

とかになっている。

設定

trac.iniとauthzをきちんとかけば良いだけだった。

  • proj1/conf/trac.ini
[trac]
authz_file = /path/to/svnauthz
authz_module_name = proj1
  • proj2/conf/trac.ini
[trac]
authz_file = /path/to/svnauthz
authz_module_name = proj2

と書いてsubversionのauthzファイルで

[proj1:/]
hoge = rw

[proj2:/]
fuga = rw

Tracのプロジェクトごとに制限したい

↑のリポジトリと同じく

anonymousユーザ

この設定だとはtrac以前にapache側で全てdigest認証しているので
anonymousユーザが閲覧することはありえない。digest認証してないなら、anonymousユーザをがっつりauthenticatedに変更するのもあり?
まあそれは別問題。

authenticated ユーザ

名前のとおり認証されたユーザに対しての権限なので、今の設定だとapacheの認証設定のdigestファイルは共通なのでhogeも/trac/proj2が閲覧できる。

カスタムグループを作成して、ビルトインのauthenticatedを消せば出来るか。

proj1の設定
まずユーザhogeをカスタムグループに所属させる。

trac-admin trac1 permission add hoge custom_allow_group

あとはanonymous, authenticatedに与えられている権限を消して、
custom_allow_groupに付け直す。
で、これもtrac-adminコマンドだと面倒なのでDB直接さわる。

$ psql proj1
proj1=> update permission set username = 'custom_allow_group'
proj1->   where username = 'authenticated';
proj1=> update permission set username = 'custom_allow_group'
proj1->   where username = 'anonymous';

同じことをproj2のfugaユーザにもやればいい。

pluginを使ってがっつり細かく制限する方法

authz_policy.py pluginを使うと。wikiのページ単位などで制限できるらしい。けど面倒なのでやらないことにした。

1. ConfigObjをinstall
http://www.voidspace.org.uk/python/configobj.html

2. authz_policy.pyをpluginsディレクトリにコピー
http://svn.edgewall.org/repos/trac/branches/0.11-stable/sample-plugins/permissions/authz_policy.py # ここはglobalにinstallできそう

3. trac.iniを編集
[trac] permission_policiesの先頭にAuthzPolicyを追加
[authz_policy] authz_fileにsubversionの認証ファイル追加
=> [trac]のauthz_fileと同じのを指定?

[components]
authz_policy.* = enabled

[trac]
auth_file 内でシンタックス [modulename:/some/path] を使用する場合、以下の設定を追加してください:
authz_module_name = modulename

modulename には、 [trac] セクション中の repository_dir に設定したリポジトリと同じものを設定します
 (訳注: Subversion で SVNParentPath を使用して複数のリポジトリをホストしている
 場合のリポジトリ指定方法です。 modulename は個々のリポジトリを指します。)