この特集のトップページへ
Chapter 5:ビジネスロジック層の構築

head2.gif 5.1.3 コンテキストの詳細
 先に触れたように,コンテキストはCOMオブジェクトとして提供されている。では,コンテキストがどのような情報を備えているのかについて,詳しく説明しよう。

 コンテキストに対応するCOMオブジェクトは,「オブジェクトコンテキストオブジェクト」と「セキュリティ呼び出しコンテキストオブジェクト」という2つに分類される。前者はCOMオブジェクトの状態を保持するオブジェクトであり,後者はCOMオブジェクトのセキュリティ情報を保持するオブジェクトである。インタセプタは,この2つのCOMオブジェクトから情報を取得し,COMクライアントにメソッドを呼び出す権限があるかどうかを調べたり,メソッドの呼び出しによってトランザクションを開始すべきかどうかを判断したりしている(Fig.5-6)。

Fig.5-6 コンテキストとインタセプタ
fig5_06.gif

 オブジェクトコンテキストオブジェクトとセキュリティ呼び出しコンテキストオブジェクトは,インタセプタが内部でのみ使うCOMオブジェクトというわけではなく,一般に公開されているCOMオブジェクトである。COMオブジェクトは,この2つのコンテキストオブジェクトを取得することで,セキュリティ情報を取得したり,その時点のCOMオブジェクトの状態――たとえばトランザクション処理が開始されているかどうかなど――を認識したりすることができる。


One Point!COM+にかかわるタイプライブラリは,「COM+ Service Type Library」である。Visual BasicでCOMコンポーネントを作り,そのCOMコンポーネントからオブジェクトコンテキストオブジェクトやセキュリティ呼び出しコンテキストオブジェクトへとアクセスする場合には,そのタイプライブラリを参照設定する必要がある。

●セキュリティ呼び出しコンテキストオブジェクト
 セキュリティ呼び出しコンテキストオブジェクトは,「COMオブジェクトのメソッドを呼び出すことができるのは誰か」というセキュリティ情報を保持するオブジェクトである。このオブジェクトには,コンポーネントサービス管理ツール(COM+カタログ)におけるセキュリティ設定の情報(ロールの情報)が含まれる。ただし,COM+アプリケーションのプロパティにおける[セキュリティ]ページで[プロセスレベルでのみアクセスチェックを実行する]を選択した場合(Fig.4-26参照)には,セキュリティ呼び出しコンテキストオブジェクトは存在しない(アクティベータによって実体化されず,参照しようとしてもNothingが戻る)。

 セキュリティ呼び出しコンテキストオブジェクトは,COM+に管理されているCOMオブジェクトからGetSecurityContext関数(Visual Basicの場合)か,CoGetCallContext関数(Visual C++の場合)を呼び出すことで取得できる。Visual Basicの場合,GetSecurityContext関数で取得したセキュリティコンテキストオブジェクトはSecurityCallContextオブジェクトとなる。SecurityCallContextオブジェクトは,Table 5-1に示すメソッドとプロパティを備えている。

 ただし,すぐあとに説明するように,セキュリティ呼び出しコンテキストオブジェクトが保持する内容は,オブジェクトコンテキストオブジェクトからも同じように参照できる。そのため,セキュリティ呼び出しコンテキストオブジェクトを利用する場面は,あまり多くはない。セキュリティについての詳細は,「5.2. セキュリティ機構」で説明する。

Table 5-1 SecurityCallContextオブジェクト
プロパティ
Count As Longセキュリティ呼び出しコンテキストオブジェクトが保持する付加情報の数を得る
Item(name As String) セキュリティ呼び出しコンテキストオブジェクトが保持する付加情報のオブジェクトを得る。name引数には,以下の文字列のいずれかを指定する
name引数戻り値の型解説
DirectCallerSecurityIdentityオブジェクト直接このCOMオブジェクトを呼び出したユーザーの情報
OriginalCallerSecurityIdentityオブジェクトCOM+の管理下にある最初のCOMオブジェクト(COM+の管理外から呼び出されたCOMオブジェクト。「5.4 COM+のトランザクション機能」で説明するルートオブジェクト)を呼び出したユーザーの情報
MinAuthenticationLevelLongCOM+の管理下にある一連のCOMオブジェクトを呼び出したときに経由した,最も弱いセキュリティレベル
NumCallersLongCOM+の管理下にある一連のCOMオブジェクトを呼び出した総数
CallersSecurityCallersオブジェクトCOM+の管理下にある一連のCOMオブジェクトを呼び出した,すべてのユーザーの情報
メソッド
IsCallerInRole(bstrRole As String) As Boolean メソッドを直接呼び出したユーザーもしくはプロパティを直接参照したユーザーがbstrRoleというロールに属しているかどうかを調べる。属していればTrue,そうでなければFalseが戻る。なお,セキュリティ設定が無効の場合(IsSecurityEnabledメソッドがFalseを返す場合)は,常にTrueを返すので注意すること
IsSecurityEnabled() As Boolean セキュリティ設定が有効かどうかを調べる。Fig.4-26において[このアプリケーションへのアクセスチェックを行う]が有効になっていればTrueが,そうでなければFalseが戻る
IsUserInRole(VARIANT pUser, bstrRole As String) As Boolean pUserという実ユーザーがbstrRoleというロールに属するかどうかを調べる。属していればTrueが,そうでなければFalseが戻る。なお,セキュリティ設定が無効の場合(IsSecurityEnabledメソッドがFalseを返す場合)は,常にTrueを返すので注意すること
prevpg.gif Chapter 5-1 5/23 nextpg.gif