miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

fine grained permissions の設定をやってみた

前項 では SVN の権限分離したわけだけど、Tracリポジトリブラウザから参照できたら意味がないわけで。

TracFineGrainedPermissions - The Trac Project に載っている fine grained permissions の設定をやってみました。

このページで紹介されているのは AuthzPolicy と mod_authz_svn-like permission policy の二種類だけど、今回の目的(anonymous が /protected 以下を見られないようにしたい)に合っているのは後者のほうでした。

AuthzPolicy→失敗

こちらの方法では

<realm>:<id>@<version>[/<realm>:<id>@<version> ...]

といった形式でアクセス制限できるそうで。例は

[wiki:WikiStart@*]
* = WIKI_VIEW

[wiki:PrivatePage@*]
john = WIKI_VIEW
* =

こんな感じだから、anonymous に /protected 以下を見せたくない場合は、

[browser:protected]
anonymous =

[log:protected]
anonymous =

[changeset:protected]
anonymous =

こんな感じで設定すればいいのかな?

・・・と、試してみたけどうまくいかず。

どうも IPermissionPolicy の check_permission() っていうのは権限が要求されたタイミングで呼び出されるけど、BROWSER_VIEW が要求されたタイミングではリポジトリのパスを識別する情報は渡されない(resource が None になってる)から、ここでは判断できないってことみたい。例にあるように、Wiki のページ単位の制御やバージョン単位の制御がやりたい場合に使える方法と。

mod_authz_svn-like permission policy →成功

Subversion と共通の authz ファイルを使って、リポジトリのパスに制限をかける方法のようで。

本当は Subversion で設定予定だった /path/to/svn/conf/authz

[groups]
developers = user1,user2,user3

[/]
@developers = rw
* = r

[/protected]
@developers = rw
* =

こいつを設定したやるのがいいんだろうけど、前項のとおり SVN 側では設定できなかったわけで。使ってもないファイルが /path/to/svn/conf に残っていても紛らわしいので、/path/to/trac/conf のほうに 新しく authz を作ってやることにする。

Trac 側の authz では

  • not authenticated なユーザが anonymous という名前で参照できる
  • 書き込み権限を気にしなくてもいい(よね?)

ということで、こんな感じでシンプルに書ける。

[/]
* = r

[/protected]
anonymous =

そして、trac.ini で

[trac]
authz_file = /path/to/trac/conf/authz

みたいに設定してやると、それっぽく動作している様子。

いくつか操作を試してみると、anonymous ユーザでは

  • リポジトリブラウザ上に /protected 自体が表示されない
    • タイムラインも同様に、/protected に関わる(?)チェンジセットは表示されない
  • パスを直接指定して表示しようとしても「この操作を行うには /protected へのアクセスが拒否されました 権限が必要です」(ちょっと日本語変だな・・・)のメッセージになる

ということで、結構完璧に制御できている雰囲気。

ようやくひととおり権限分離ができたかな。これで個人情報とかお金絡みの情報とか、気兼ねなくリポジトリに突っ込める。