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
とかになっている。
- http://example.com/trac/proj1
- user: hogeにだけ見せたい
- http://example.com/trac/proj2
- user: fugaにだけ見せたい
設定
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のプロジェクトごとに制限したい
↑のリポジトリと同じく
- http://example.com/trac/proj1
- user: hogeにだけ見せたい
- http://example.com/trac/proj2
- user: fugaにだけ見せたい
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 は個々のリポジトリを指します。)