プロフィール

ハンドル
くろい えのぐ
twitter
@enogu

たぶんプログラマ
主にPHP版汝は人狼なりや?のメンテナンスなどをやっているとかいないとか。

使っている言語はC#とPHPとときどきC。Javascript(かDart)をマスターしたい。

最近更新された記事

FormItでメールフォームを作成する
2013-08-20
Quip ー MODXページにコメント欄をつける
2012-08-20
MODX Revolutionのアクセス制御について
2012-07-18
せめて日本人に何となく伝わってほしいポインタの話
2012-06-13
MODXでブログを作ってみた その1:getResources
2012-04-04

タグ

  • PHP (1)
  • Silverlight (1)
  • xPDO (1)
  • 残念なお知らせ (2)
  • OpenIndiana (2)
  • PIC (2)
  • MODX (8)
  • MODX Revolutionのアクセス制御について

    作成日: 2012-07-17 / タグ: MODX

    昨日そうし(@_so4)さんがこんなこと仰っていたので、とりあえずMODXが実装しているABAC(属性ベースアクセス制御)の基本的な仕組みだけメモしておこうと思います。

    なお、MODX RevolutionとEvolutionではアクセス制御の仕組みが違います。この記事で説明している内容はすべてRevolutionに関するものです。

    アクセス属性とは

    MODXを使用する上で、ドキュメント、スニペットおよびメディアの追加、編集、あるいは削除を行う場合、各作業ごとに個別でシステムから許可を得る必要があります。これがアクセス属性で、インストール直後に提供される管理ユーザーはマネージャーで行う作業についてはすべてのアクセス属性を最初から持っています。

    以後の説明では"ユーザーに与えられているアクセス属性の組み合わせ"を略して権限と呼びます。

    ユーザーグループとロール

    各ユーザーの持つ権限は、大まかには所属しているユーザーグループによって決まります。例えばAdministratorグループに所属していれば管理者としての権限が与えられますし、他のグループを作って異なる権限を設定すれば、新しいユーザーに管理者とは違う権限を与えることも出来ます。

    では、同じグループ内で微妙に与える権限を変えたい場合はどうなるでしょうか。例えば複数ユーザーで運営しているブログについて、編集者とシステム管理者を分けたい場合などがあるかもしれません。この場合、ロールという仕組みを使います。ロールは同じグループ内におけるユーザーの立場を分けるための仕組みで、同じグループでもロールごとに与えられる属性を切替えることが出来ます。

    ロールの優劣は順位(降順)によって決められており、より順位が高い(=番号が若い)ロールはより低いロールの権限も与えられます。デフォルトで存在するロールはスーパーユーザー(0位)とメンバー(9999位)です。

    アクセスポリシーとテンプレート

    さて、このユーザーグループとロールへの権限の割り当てですが、いちいちグループごとに権限を追加する作業はまどろっこしくてやっていられません(Revo 2.2ではマネージャー用のアクセス属性だけで実に172種類あります)。そこで、アクセス属性の組み合わせはアクセスポリシーという形式でまとめられるようになっており、各ロールに一つポリシーを割り当てることで権限の設定が出来るようになっています。従って前述した"ロールの権限"はアクセスポリシーと同一と思ってかまいません。

    アクセスポリシーはグループやロールとは独立していて、同じポリシーを使い回せるようになっています。またポリシーにアクセス属性を割り当てる作業自体もテンプレートを事前に用意して、それのオンオフを切り替えることで編集する仕組みになっています。

    実際にAdministratorTemplateの中身を眺めてから、それに対応したポリシーを作成してみましょう。

    1. 各アクセス属性は必ずオン/オフで表現できる内容にします。例えばドキュメントへのアクセス属性であれば作成の許可(オン/オフ)、閲覧の許可(オン/オフ)、変更の許可(オン/オフ)、削除の許可(オン/オフ)と四つの属性が個別に用意されています。
    2. これに対応するポリシーを作ります。
    3. まずアクセスポリシーの一覧を表示
    4. 新規作成
    5. テンプレートを選択して
    6. 保存。
    7. 早速編集しましょう。
    8. これで削除権のない"Test"アクセスポリシーが追加されます。

    コンテキスト、カテゴリー、およびメディアソースとアクセス属性

    アクセスポリシーはコンテキスト、リソースグループ、カテゴリー、およびメディアソースごとに設定できます。

    リソースグループについては後で説明するとして、ひとまず残り三つについておおざっぱに説明すると、一つのロールに対してwebコンテキストとmgrコンテキストには異なるアクセスポリシーを与えることが出来ます(注:前述の通りアクセスポリシーはロール単位で設定します)。

    同じようにカテゴリーとメディアソースについてもそれぞれにロールによって異なるアクセスポリシーが適用できますが、この時注意が必要なのがテンプレートです。エレメントやメディアソースはそれぞれ独特のオブジェクトを扱うため、適用可能なテンプレートが制限されています。それぞれElementTemplateとMediaSourceTemplateを適用したアクセスポリシーしか選択できない仕組みになっているので注意して下さい。

    リソースグループ

    リソースグループはドキュメントなどのリソースを分類する機能です。リソースグループにもコンテキストと同じようにロールごとのアクセスポリシーを設定可能で、これを使うことで特定のリソースのみに専用の権限を設定することができます。

    例えばこの機能を会員のみに提供するページに使用した場合、コンテキストを分割するまでもなく特定のドキュメントへの一般ユーザーによるアクセスを禁止できるようになります。

    TODO

    ここまでぐだぐだと書いてきましたが詳しく説明できない問題が二つ。

    アクセスポリシーが全く割り当てられていない場合のデフォルト動作というものがあるのですが、これの法則性はまだ調べていません。マネージャーコンテキストへのアクセスはユーザーアカウントがないと出来ず、そのデフォルト値はどうやらAdministratorグループのスーパーユーザーのようですが未確認。カテゴリーやメディアソース、ましてリソースグループあたりは全然試せていません…

    あとMODXのロールは基本的に権限の強い方が弱い方の持っている属性を総取りする仕組みになっていると説明しましたが、この機能は実際に試してみたことがないです。