名前空間を設計する方法

DokuWiki名前空間設計はアクセスコントロール設計と等しい。

会社組織の例

例として、営業部、開発部の2つの部が存在する小規模の会社組織の構造を考える。

会社から出される情報には社員なら誰でもアクセスできる。
しかし、各部には他の部には明かせない固有の情報が存在するものである。

このような場合は、以下のアクセス権を設定する必要がある。

  1. 社員なら会社から出された情報を得る権限
  2. 営業部に所属するなら営業部の情報を得る権利
  3. 開発部に所属するなら開発部の情報を得る権利

DokuWikiのアクセスコントロール

DokuWikiではユーザ名やグループ名によってアクセスコントロールを行う。
ユーザには所属するグループ名を設定することができる。
グループ名はページや名前空間に設定されたアクセス権を表す識別子である。
ページは何れかの名前空間に配置され、そのIDは名前空間とページ固有の識別子で成り立つ。
例えば、ページIDが「mycom:top」の場合、名前空間は「mycom」で識別子は「top」となる。
名前空間に設定されたアクセス権の有効範囲は、その名前空間の直下に配置されているページと、その名前空間の配下に存在する名前空間やページとなる。
ある名前空間の配下の名前空間やページに別のグループ名を持つアクセス権を設定しても、上位の名前空間に設定されたアクセス権はなくならない。
上位の名前空間に設定されたアクセス権を無効にするためには、そのグループ名によりアクセス権を再設定する必要がある。

具体的に、開発部の社員「devel01」と、営業部の社員「sales01」について考えて見る。
以下のように名前空間とページを配置した場合、devel01は「mycom:top」ページと「mycom:devel:secret」ページに、sales01は「mycom:top」ページと「mycom:sales:secret」ページにアクセスできるようにしたいので、devel01を「mycom」と「devel」グループに、sales01を「mycom」と「sales」グループに所属させたとする。

 |
 +- mycom: [mycom(r)]
     +- devel: [devel(r)]
     |   +- secret <mycom(r), devel(r)>
     +- sales: [sales(r)]
     |   +- secret <mycom(r), sales(r)>
     +- top <mycom(r)>

-[]で囲まれたものは設定されたグループ名で()内はそのアクセス権
-<>で囲まれたものは上位の名前空間から継承したアクセス権
-単語の末尾にコロン ":" が付いたものは名前空間、
 付かないものはページ
-アクセス権は(n)が無し、(r)が読取、(e)が編集、(m)が作成、
 (u)がアップロード、(d)が削除、今回登場するのは(n)と(r)のみ

しかし、上記のようにアクセス権を設定すると、sales01が「mycom」グループに所属するので、上位の名前空間から継承したアクセス権により、sales01は「mycom:devel:secret」ページにアクセスできることになる。

これを意図した通りの構成にしたい場合は以下のようにアクセス権を設定する。

 |
 +- mycom: [mycom(r)]
     +- devel: [mycom(n), devel(r)]
     |   +- secret <devel(r)>
     +- sales: [mycom(n), sales(r)]
     |   +- secret <sales(r)>
     +- top <mycom(r)>

上記の具体例は、名前空間とページの構成が、アクセス権の構成と異なる場合の内容である。

適切なページ構成

名前空間とページの構成を会社組織の構成に合わせるよりも、デフォルトでアクセス権が継承されることによる事故を防ぐために、ページ構成をアクセス権の構成に合わせて以下のように設計するのが適切である。

 |
 +- mycom: [mycom(r)]
 |   +- top <mycom(r)>
 +- devel: [devel(r)]
 |   +- secret <devel(r)>
 +- sales: [sales(r)]
     +- secret <sales(r)>

これでいちいち継承されたアクセス権を否定するアクセス権を設定する必要がなくなる。