ここでは,アクセス制御と排他制御の関係について説明します。
作成したオブジェクトに対してメソッドをコールすると,DocumentBrokerではオブジェクトの操作に必要なロックを設定して処理します。アクセス制御では,まず,クラスライブラリのオブジェクトに対してロックを設定してから,ACFlag,パブリックACLおよびローカルACLを参照して,アクセス権を判定します。
ACFlagおよびローカルACLは,クラスライブラリのオブジェクトのプロパティとして設定されています。したがって,アクセス権判定でこれらを参照するとき,ACFlagおよびローカルACLには,オブジェクトに設定されているロックと同じ種類のロックが設定されます。
また,アクセス権判定でパブリックACLを参照する場合は,参照するパブリックACLにreadロックを設定します。
GetPropertyValuesメソッドなどのプロパティを参照するメソッドによってACFlagやACLなどのアクセス制御情報を参照する場合や,PutPropertyValuesメソッドによってアクセス制御情報を更新する場合,アクセス制御情報をプロパティとして設定してあるクラスライブラリのオブジェクトに対してロックを設定します。このロックの設定方法には,次の2種類があります。
次の手順でメソッドがコールされた場合の排他制御の関係を,表3-36に示します。
表3-36 コールするメソッドの種類とアクセス制御情報の排他制御の関係
ユーザAがコールした メソッドの種類 | ユーザBがコールしたメソッドの種類 | ||||||
---|---|---|---|---|---|---|---|
readロックを設定するメソッド | writeロックを設定するメソッド | ACFlagまたはローカルACLを参照するメソッド | ACFlagまたはローカルACLを更新するメソッド | パブリックACLを参照するメソッド | パブリックACLを更新するメソッド | パブリックACLを削除するメソッド | |
readロックを設定するメソッド | ○ | × | ○ | × | ○ | △ | × |
writeロックを設定するメソッド | × | × | × | × | ○ | △ | × |
ACFlagまたはローカルACLを参照するメソッド | ○ | × | ○ | × | ○ | ○ | × |
ACFlagまたはローカルACLを更新するメソッド | × | × | × | × | ○ | ○ | × |
パブリックACLを参照するメソッド | ○ | ○ | ○ | ○ | ○ | × | × |
パブリックACLを更新するメソッド | △ | △ | ○ | ○ | × | × | × |
パブリックACLを削除するメソッド | × | × | × | × | × | × | × |
パブリックACLに対するメソッドが排他制御されるのは,アクセス権判定のときにパブリックACLの内容が参照されている場合です。つまり,ユーザAがあるオブジェクトを参照しようとしたときに,ユーザ権限やACFlagの内容でアクセス権が確認できず,パブリックACLの内容を参照してアクセス権判定を行った場合,そのパブリックACLにはユーザAによってreadロックが設定されます。このとき,ユーザBはパブリックACLの内容を更新できません。
また,パブリックACLをユーザAが更新している場合に,パブリックACLによるアクセス権判定が必要なメソッドをユーザBがコールすることはできません。パブリックACLを削除するときには,このパブリックACLをバインドしているオブジェクトにもwriteロックが設定されます。