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

head1.gif 5.2 セキュリティ機構

 COM+のセキュリティ機構については,すでに「Chapter 4 ビジネスロジック層の構築 〜COM+の概要〜」で概説した。ここでは,もう少し詳細に,COM+のセキュリティ機構について説明する。

head2.gif 5.2.1 ロールの判定
 「4.3 COM+のセキュリティ機構」で説明したように,COM+では,実際のユーザーではなく,ロールという仮想的な役割に対してセキュリティを設定する。

 どのロールに属するユーザーから呼び出されているのかをCOMオブジェクトから直接知ることはできないが,メソッドを呼び出した(もしくはプロパティを参照した)ユーザーが任意のロールに属しているか否かを調べることは容易である。メソッドを呼び出したユーザーが任意のロールに属しているか否かを調べるには,まず,GetObjectContext関数を使ってObjectContextオブジェクトを取得し,そのObjectContextオブジェクトのIsCallerInRoleメソッドを呼び出せばよい。

 たとえば,List 5-1のようなメソッドがあるとしよう。

 このとき,「Managerというロールに属しているユーザーが呼び出した場合には1000万円以上の金額(money引数)を扱えるが,そうでなかった場合には1000万円未満の額しか扱えない」というように設定したいとする。この場合,List 5-2のように実装すればよい。

 List 5-2では,money引数に1000万円以上の金額が指定されると,11行目でIsCallerInRoleメソッドを呼び出し,そのユーザー(このメソッドを呼び出したユーザー)がManagerロールに属しているかどうかを調べる。このチェックによって,ユーザーがManagerロールに属していなければ,13行目のErr.Raiseメソッドによってエラーが発生する。

 このとき,7行目でIsSecurityEnabledメソッドを呼び出し,セキュリティ設定が有効であるかどうかを確かめている点に注意してほしい。IsSecurityEnabledメソッドは,COM+アプリケーションのプロパティでロールによるセキュリティが有効であるかどうかを調べるためのメソッドである。Fig.4-26において[このアプリケーションへのアクセスチェックを行う]が有効になっていればTrueが,そうでなければFalseが戻る。ロールによるセキュリティが無効である場合には,IsCallerInRoleメソッドは引数にどのようなロール名を与えても常にTrueを返す仕様になっている。そのため,7〜10行目を省略してしまうと,ロールによるセキュリティが無効になっているときに,誰でも1000万円を超える金額を扱えるようになってしまうのである。

 List 5-2に示したように,そのメソッドを呼び出したユーザーが任意のロールに属しているのかを調べるのは,簡単である。結局のところ,IsSecurityEnabledメソッドでロールのセキュリティが有効であるかどうかを確認したのち,IsCallerInRoleメソッドを使ってロールに属しているかどうかを調べればよいだけの話である。

注意GetObjectContext関数で取得したObjectContextオブジェクトの有効期間は,メソッドから戻るまでのあいだである。よって,たとえば,GetObjectContext関数で取得したObjectContextオブジェクトをCOMオブジェクトの内部変数などに格納しておき,次にメソッドが呼び出されたときに利用する,といったことはできない。

prevpg.gif Chapter 5-1 7/23 nextpg.gif