目次 | 前
| 次
14. セキュリティのサポート
エンタプライズJavaBeans体系によって,セキュリティ管理実装義務のほとんどがエンタプライズBeanからEJBコンテナ及びEJBサーバにシフトできる。
エンタプライズJavaBeansでのセキュリティに対するサポートには次の部品が包含される。
-
コアパッケージjava.securityで定義される現存のJavaプログラム言語セキュリティAPI。
-
インタフェースjavax.ejb.EJBContextのセキュリティ関連メソッド
-
配置記述子のセキュリティ関連属性
14.1以降でセキュリティのサポートをより詳細に記述する。
14.1 パッケージjava.security
パッケージjava.securityは,包括的なJavaプログラム言語セキュリティ関連インタフェースを提供する。エンタプライズJavaBeans体系は,現存のJavaプログラム言語で利用可能なセキュリティAPIを使用する。
より限定していえば,エンタプライズJavaBeans体系はAPIとしてクラスjava.security.Identityを使用して,セキュリティを目的としたユーザ識別性を記述する。java.security.Identityのインスタンスは,固有のユーザ又はセキュリティの役割を記述できる。
クラスjava.security.Identityの記述に関しては,JDK参照ページを参照のこと。
EJBコンテナは,クラスjava.security.Identityのインスタンスをユーザアカウント及び/又はEJBサーバの役割(つまり,使用中のプラットフォームによって定義され管理されるユーザアカウント及び役割)にマッピングする責任をもつ。このマッピングはプラットフォーム固有の方法で実行される。
14.2 EJBContextのセキュリティ関連メソッド
エンタプライズJavaBeans APIによって,エンタプライズBeanインスタンスは現メソッドを呼び出したクライアントの識別性を獲得できる。このために,インタフェースjavax.ejb.EJBContextには次のメソッドが包含される。
-
getCallerIdentity()
-
isCallerInRole(Identity ident)
前述のメソッドの記述に関しては,javax.ejb.EJBContextの参照ページを参照のこと。
エンタプライズBeanインスタンスが現メソッドを呼び出したクライアントの識別性を獲得するための方法を次の例によって示す。
/* Obtain the security identity of the client. */
Identity caller = EJBContext.getCallerIdentity();
/* getName returns a printable representation of identity.*/
String clientAccount = caller.getName();
エンタプライズBeanインスタンスが,メソッドの呼出し者に指定されたセキュリティの役割があるかどうかをテストするための方法を次の例によって示す。
/*
* Check if the client has the "vip-account"role
*/
Identity vipAccount = new Identity("vip-account");
if (EJBContext.isCallerInRole(vipAccount)) {
do something;
}else{
do something else;
}
14.3 セキュリティ関連配置記述子特性
14.3では,ejb-jarファイルの配置記述子において渡された宣言セキュリティ情報を記述する。この情報は,エンタプライズBean提供者が設定し,配置時にコンテナツールが読み取り,解釈する。
14.3.1 アクセス制御エントリ
エンタプライズBeanの配置記述子は,アクセス制御エントリを含む。アクセス制御エントリによって,コンテナはエンタプライズBean側の実行時セキュリティ管理を実行することができる。
エンタプライズBean記述子によって,Bean提供者は,各メソッド及び/又は全体Beanに対応するAccessControlEntryを指定することができる。AccessControlEntryが全体Beanに関して指定される場合,AccessControlEntryは,個々のAccessControlEntryをもたないメソッドすべてに適用される。
AccessControlEntryは,メソッドと型java.security.Identityのエントリのリストとを関連づける。これらのセキュリティ識別性は,メソッドを呼び出すことができるユーザ又は役割である。
コンテナは配置時に,配置記述子からAccessControlEntriesをインポートし,実行時に実行する。通常は,コンテナによって配置者及びシステム管理者がコンテナ提供ツールを使用して,AccessControlEntriesを変更できる。
14.3.2 RunAsMode及びRunAsIdentity
エンタプライズBeanの配置記述子によって,Bean提供者は,エンタプライズBeanのメソッドの実行と関連づけられるセキュリティ識別性を指定できる。実行時,エンタプライズBeanのインスタンスが,データベースアクセス呼出しなどの使用中の資源管理者へ呼出しを行うか,又は別のエンタプライズBeanを呼び出す場合,このセキュリティ識別性は呼出しと関連づけられる。
識別性はセキュリティ識別性“RunAs”として表示される。
“RunAs”には次の二つがある。
-
RunAsMode RunAsModeは,メソッドがクライアントのセキュリティ識別性(CLIENT_IDENTITY),特権的システムアカウントの識別性(SYSTEM_IDENTITY),指定されたユーザアカウントの識別性(SPECIFIED_IDENTITY)のいずれで実行すべきかを指定する。
-
RunAsIdentity RunAsIdentityは,RunAsModeの値がSPECIFIED_IDENTITYと同一である場合に,ユーザ識別性を指定する。RunAsModeの値がCLIENT_IDNTITY又はSYSTEM_IDENTITYである場合,この値は無視される。
EJBコンテナは,プラットフォーム固有の方法で,SYSTEM_IDENTITYを使用中のプラットフォームの特権的アカウントにマップする。
配置記述子によって,Bean提供者は全体Beanのレベル又は各メソッドのレベルでセキュリティ識別性RunAsを指定できる。Beanレベルで指定された値は,メソッドレベルのセキュリティ識別性に指定させないすべてのメソッドに適用される。
メソッドレベルのセキュリティ識別性RunAsは,同一Beanの異なるメソッドごとに異なってもよいが,使用にあたっては次の制約を守らなければならない。
-
状態付きセションBeanに関しては,インスタンスと関連づけられたセキュリティ識別性RunAsがインスタンス生成時に確定される。このセキュリティ識別性は,セション存続時間中,インスタンスと関連づけを保つ。つまり,メソッドejbCreate()と関連づけられたセキュリティ識別性は,メソッドejbCreate()だけでなく,インスタンス上で続けて呼び出されるすべてのメソッドにも適用されるということである。呼び出されたメソッドは,矛盾しているセキュリティ識別性RunAsを指定してはならない。
-
無状態セションBeans及び実体Beansに関しては,同一トランザクションのBeanインスタンス上で呼び出されるすべてのメソッドが,同一の識別性RunAsで実行されなければならない。つまり,同一トランザクションで実行されるすべてのメソッドに関して,指定された識別性RunAsは同一でなければならない。
Bean提供者及びアプリケーション組立て者は,この制約を守らなければならない。規則違反を検出したEJBコンテナは,クライアントにjava.rmi.RemoteExceptionを投げ,エラーを記録しシステム管理者に知らせなければならない。
目次 | 前 |
次