例 : エンタープライズ JavaBean (EJB) リソースの保護
この例では、ejb20_basic_statelessSession JAR 内のすべて EJB へのアクセスを、作成したグローバルセキュリティ ロールが付与されているユーザに制限します。次に、この EJB JAR に含まれる statelessSession EJB へのアクセスを別のユーザに制限します。最後に、特定の EJB メソッド (create() メソッドと buy() メソッド) に対するセキュリティをさらに強化します。
注意: この例に進む前に、URL リソースおよび EJB リソースを保護する方法、URL リソースおよび EJB リソースを保護するための前提条件、およびセキュリティ ロールのタイプ : グローバル ロールとスコープ ロールに目を通しておいてください。
WebLogic Server Administration Console を使用してエンタープライズ JavaBean (EJB) を保護するには、次の手順に従います。
手順 1 : サーバと前提設定を指定する
- fullyDelegateAuthorization フラグの変更方法の指示に従って、fullyDelegateAuthorization フラグを true に設定します。
注意: この設定の意味 : すべての URL (Web) および EJB リソースに対して WebLogic Security サービスによるセキュリティ チェックを実行するよう WebLogic Server に指示します。 詳細については、fullyDelegateAuthorization フラグについてを参照してください。
- Windows の [スタート] メニューから、[プログラム|BEA WebLogic Platform 7.0|WebLogic Server 7.0|Server Tour and Examples|Launch Examples Server] を選択して examplesServer というサーバを起動します。
examplesServer が起動するとコンソールにfullyDelegateAuthorization フラグが表示され、ブラウザに [BEA WebLogic Server Out-of-the-Box Examples Index Page] が表示されます。
- [BEA WebLogic Server Out-of-the-Box Examples Index Page] の上部にある [ Administration Console] リンクをクリックします。
- [サインイン] ボタンをクリックして examplesServer の Administration Console にサインインします。
- Administration Console の左側のナビゲーション ツリーを使用して、[セキュリティ|レルム] を展開します。
- myrealm セキュリティ レルムをクリックします。
- [一般] タブで、[デプロイメント記述子内のセキュリティ データを無視] チェック ボックスをクリックします(つまり、ボックスにチェック マークを入れます)。
注意: この設定の意味 : Administration Console を使用して、Web アプリケーションおよび EJB リソースのセキュリティを設定するように WebLogic Server に指示します。 詳細については、[デプロイメント記述子内のセキュリティ データを無視] チェック ボックスについてを参照してください。
- [適用] をクリックして変更を保存します。
手順 2 : グループを作成する
- Administration Console の左側のナビゲーション ツリーを使用して、[セキュリティ|レルム] を展開します。
- myrealm セキュリティ レルムを展開します。
- [グループ] をクリックします。
[グループを選択] ページには、WebLogic 認証プロバイダのデータベースで現在定義されているすべてのグループが表示されます。
- [新しいグループのコンフィグレーション] リンクをクリックして、[グループの作成] ページを表示します。
- [一般] タブの [名前] フィールドに Testers と入力します。
- 必要な場合は、[記述] フィールドにグループの説明を入力します。
- [適用] をクリックして変更を保存します。
手順 3 : ユーザを作成する
- ナビゲーション ツリーを使用して [ユーザ] をクリックします。
[ユーザを選択] ページには、WebLogic 認証プロバイダのデータベースで現在定義されているすべてのユーザが表示されます。
- [新しいユーザのコンフィグレーション] リンクをクリックして、[ユーザの作成] ページを表示します。
- [一般] タブの [名前] フィールドに Stephanie と入力します。
- 必要な場合は、[記述] フィールドにユーザの説明を入力します。
- [パスワード] および [パスワードの確認] フィールドに ejbexample と入力します。
- [適用] をクリックして変更を保存します。
- 手順 2 から 6 を繰り返して Jen というユーザを作成します。
- ナビゲーション ツリーを使用して [ユーザ] をクリックし、ユーザ Stephanie および Jen が追加されていることを確認します。
[ユーザを選択] ページを表示すると、Stephanie と Jen が WebLogic 認証プロバイダのデータベースに追加されていることがわかります。
手順 4 : ユーザをグループに追加する
- [ユーザを選択] ページで、ユーザ名 Stephanie のリンクをクリックします。
- [グループ] タブをクリックします。
- [指定できるグループ] リスト ボックスで、Testers グループを強調表示します。
- 強調表示された右矢印をクリックして、[指定できるグループ] リスト ボックスから [現在のグループ] リスト ボックスに Testers グループを移動します。
- [適用] をクリックして変更を保存します。
注意: Jen は Testers グループに追加しないでください。
手順 5 : グローバル ロールを作成する
- ナビゲーション ツリーを使用して [ロール] をクリックします。
[ロールの選択] ページには、WebLogic ロール マッピング プロバイダのデータベースで現在定義されているすべてのグローバル ロールが表示されます。
- [新しい Role のコンフィグレーション] リンクをクリックして、[ロールを作成] ページを表示します。
- [一般] タブの [名前] フィールドに QA と入力します。
- [適用] をクリックして変更を保存します。
手順 6 : グループにグローバル ロールを付与する
- [条件] タブをクリックします。
- [ロール条件] リスト ボックスで、[呼び出し側をメンバとするグループは] を強調表示します。
- [追加] をクリックして [グループ] ウィンドウを表示します。
- [グループ名の入力] フィールドに Testers と入力します。
- [追加] をクリックしてから [OK] をクリックします。
[グループ] ウィンドウが閉じます。[ロール文] リスト ボックスに次のように表示されます。
呼び出し側をメンバとするグループは
Testers
- [適用] をクリックして変更を保存します。
手順 7 : グローバル ロールを使用して statelessSession EJB JAR のセキュリティ ポリシーを作成する
- ナビゲーション ツリーを使用して、[デプロイメント|EJB] を展開します。
- ejb20_basic_statelessSession.jar を右クリックします。
- メニューから [ポリシーを定義] オプションを選択します。
注意: このオプションの意味 : EJB JAR レベルでセキュリティ ポリシーを作成します。JAR 内のすべての EJB とその EJB 内のすべてのメソッドが含まれます。
- [ポリシー条件] リスト ボックスで、[呼び出し側に許可するロールは] を強調表示します。
- [追加] をクリックして [ロール] ウィンドウを表示します。
- [ロール名の入力] フィールドに QA と入力します。
- [追加] をクリックしてから [OK] をクリックします。
[ロール] ウィンドウが閉じます。[ポリシー文] リスト ボックスに次のように表示されます。
呼び出し側に許可するロールは
QA
注意: ejb20_basic_statelessSession.jar のセキュリティ ポリシーを定義すると、EJB リソース タイプ対して既に定義されているセキュリティ ポリシーがオーバライドされることに注意してください。具体的には、以下の継承されたポリシー文がオーバライドされます。
呼び出し側をメンバとするグループは
Everyone
上記は [継承されたポリシー文] リスト ボックスに表示されます。
この [呼び出し側をメンバとするグループは] ポリシー条件は、EJB リソースのデフォルト セキュリティ ポリシーの一部です。 詳細については、デフォルト セキュリティ ポリシーを参照してください。
- [適用] をクリックして変更を保存します。
手順 8 : クライアント アプリケーションから EJB へのアクセスを試行する
注意: この節で説明する手順はすべて、Windows 環境での作業を想定しています。
- DOS シェルを開いて、cd WL_HOME¥samples¥server¥config¥examples と入力します。WL_HOME は、WebLogic Platform の最上位のインストール ディレクトリです。
- setExamplesEnv.cmd と入力して、環境を設定します。
- cd ..¥..¥src¥examples¥security¥jaas と入力します。
- ant と入力してサンプルをビルドします。
- sample_jaas.config ファイルを WL_HOME¥samples¥server¥src¥examples¥security¥jaas ディレクトリから JAVA_HOME¥jre¥lib¥security ディレクトリに手動でコピーします。JAVA_HOME は Java SDK がインストールされているディレクトリです。
- java.security ファイル (JAVA_HOME¥jre¥lib¥security に格納) を編集して、ファイルの最後に次の行を (すべて 1 行で) 追加します。
login.config.url.1=file:${java.home}/lib/security/
sample_jaas.config
- examplesServer を再起動します。 詳細については、『管理者ガイド』の「WebLogic Server の起動と停止」を参照してください。
- WL_HOME¥samples¥server¥src¥examples¥security¥jaas ディレクトリで、build.xml ファイルを次のように編集します。
- ファイルの最後までスクロールして <target name="run"> という行を見つけます (リスト7-1 に太字で示されています)。
- <arg line> 要素で、ユーザ名とパスワード (現在は weblogic weblogic) を Stephanie ejbexample に変更します (リスト7-1 に太字で示されています)。
- build.xml ファイルを保存します。
コード リスト 7-1 build.xml ファイルの該当する部分
<!-- Run the example -->
<target name="run" >
<java classname="examples.security.jaas.SampleClient"
fork="yes" failonerror="true">
<arg line="t3://localhost:${PORT} weblogic weblogic"/>
<classpath>
<pathelement path="${CLASSPATH};${CLIENT_CLASSES}/
ejb20_basic_statelessSession_client.jar;
${CLIENT_CLASSES}/utils_common.jar"/>
</classpath>
</java>
</target>
- 同じディレクトリ (WL_HOME¥samples¥server¥src¥examples¥security¥
jaas) で、ant run と入力します。 以下のような出力が表示されます。
Buildfile: build.xml
run:
[java] username: Stephanie
[java] password: **********
[java] URL: t3://localhost:7001
[java] Creating a trader
[java] Buying 100 shares of BEAS.
[java] Buying 200 shares of MSFT.
[java] Buying 300 shares of AMZN.
[java] Buying 400 shares of HWP.
[java] Selling 100 shares of BEAS.
[java] Selling 200 shares of MSFT.
[java] Selling 300 shares of AMZN.
[java] Selling 400 shares of HWP.
[java] Removing the trader
BUILD SUCCESSFUL
Total time: 5 seconds
セキュリティ ポリシーで保護した ejb20_basic_statelessSession.jar に格納されている EJB をクライアント アプリケーションが呼び出したため、このような結果になります。
- build.xml ファイルのユーザ名とパスワードとして Jen ejbexample を使用し、手順 8 と 9 を繰り返します。
以下で始まる出力が表示されます。
run:
[java] username: Jen
[java] password: **********
[java] URL: t3://localhost:7001
[java] Creating a trader
[java] java.rmi.AccessException: Security violation: User Jen has insufficient permission to access method; nested exception is:
[java] java.lang.SecurityException: Security violation: User Jen has insufficient permission to access method
セキュリティ ポリシーで保護した ejb20_basic_statelessSession.jar に格納されている EJB をクライアント アプリケーションが呼び出したため、このような結果になります。
手順 9 : statelessSession EJB へのアクセスを制限する
- Administration Console の左側のナビゲーション ツリーを使用して、ejb20_basic_statelessSession.jar を右クリックします。
- メニューから [個別の Bean のポリシーとロールを定義] オプションを選択します。
JAR ファイル内のすべての EJB (この場合は statelessSession EJB のみ) を示すテーブルが表示されます。
注意: このオプションの意味 : EJB レベル (セキュリティ ポリシーは EJB 内のすべてのメソッドに適用される)、または EJB 内の特定のメソッド レベルでセキュリティ ポリシーを作成できます。
- statelessSession EJB の [ポリシーを定義] リンクをクリックします。
- [ポリシー条件] リスト ボックスで、[呼び出し側のユーザ名は] を強調表示します。
注意: [Methods] ドロップダウン メニューに表示される値は変更しないでください (ALL と表示されています)。
- [追加] をクリックして [ユーザ] ウィンドウを表示します。
- [ユーザ名の入力] フィールドに Jen と入力します。
- [追加] をクリックしてから [OK] をクリックします。
[ユーザ] ウィンドウが閉じます。[ポリシー文] リスト ボックスに次のように表示されます。
呼び出し側のユーザ名は
Jen
注意: statelessSession EJB に対するこのセキュリティ ポリシーを定義すると、手順 7 : グローバル ロールを使用して statelessSession EJB JAR のセキュリティ ポリシーを作成する.で EJB JAR に対して定義したセキュリティ ポリシーがオーバライドされることに注意してください。具体的には、以下の継承されたポリシー文がオーバライドされます。
呼び出し側に許可するロールは
QA
上記は [継承されたポリシー文] リスト ボックスに表示されます。
- [適用] をクリックして変更を保存します。
- 手順 8 : クライアント アプリケーションから EJB へのアクセスを試行するの 8 から 10 を繰り返します。
クライアント アプリケーションからの出力は、前述の場合と反対になります。 つまり、Stephanie は statelessSession EJB へのアクセスを拒否され、Jen はアクセスを許可されます。
セキュリティ ポリシーで保護した EJB をクライアント アプリケーションが呼び出したため、このような結果になります。
手順 10 : create() および buy() EJB メソッドへのアクセスを制限する
- Administration Console の左側のナビゲーション ツリーを使用して、ejb20_basic_statelessSession.jar を右クリックします。
- メニューから [個別の Bean のポリシーとロールを定義] オプションを選択します。
JAR ファイル内のすべての EJB (この場合は statelessSession EJB のみ) を示すテーブルが表示されます。
注意: このオプションの意味 : EJB レベル (セキュリティ ポリシーは EJB 内のすべてのメソッドに適用される)、または EJB 内の特定のメソッド レベルでセキュリティ ポリシーを作成できます。
- statelessSession EJB の [ポリシーを定義] リンクをクリックします。
- [Methods] ドロップダウン メニューを使用して、create() - HOME メソッドを選択します。
- [ポリシー条件] リスト ボックスで、[呼び出し側をメンバとするグループは] を強調表示します。
- [追加] をクリックして [グループ] ウィンドウを表示します。
- [グループ名の入力] フィールドに Testers と入力します。
- [追加] をクリックしてから [OK] をクリックします。
[グループ] ウィンドウが閉じます。[ポリシー文] リスト ボックスに次のように表示されます。
呼び出し側をメンバとするグループは
Testers
注意: create() メソッドに対するこのセキュリティ ポリシーを定義すると、手順 9 : statelessSession EJB へのアクセスを制限する.で statelessSession EJB に対して定義したセキュリティ ポリシーがオーバライドされることに注意してください。具体的には、以下の継承されたポリシー文がオーバライドされます。
呼び出し側のユーザ名は
Jen
これは、[Methods] ドロップダウン メニューから ALL を選択すると [ポリシー文] リスト ボックスに表示されます。
- [適用] をクリックして変更を保存します。
- 同じ [ポリシー文] を使用して手順 4 から 9 を繰り返し、buy(java.lang.String, int) - REMOTE メソッドを保護します。
- 手順 8 : クライアント アプリケーションから EJB へのアクセスを試行するの 8 から 10 を繰り返します。
ユーザ Stephanie の場合と Jen の場合では、クライアント アプリケーションの出力が異なるメソッドで失敗します。 sell() メソッドはクライアント アプリケーションで create() および buy() メソッドの後になるので、ユーザ Stephanie はこのメソッドでアクセスを拒否されます (サンプル出力については「リスト7-2」を参照)。 ユーザ Jen は create() メソッドでアクセスを拒否されます (サンプル出力については「リスト7-3」を参照)。
コード リスト 7-2 ユーザ Stephanie の出力 : sell() メソッドでアクセス拒否
Buildfile: build.xml
run:
[java] username: Stephanie
[java] password: **********
[java] URL: t3://localhost:7001
[java] Creating a trader
[java] Buying 100 shares of BEAS.
[java] Buying 200 shares of MSFT.
[java] Buying 300 shares of AMZN.
[java] Buying 400 shares of HWP.
[java] Selling 100 shares of BEAS.
[java] java.rmi.AccessException: Security Violation: User: 'Stephanie' has insufficient permission to access EJB: type=<ejb>, application=_appsdir_ejb20_basic_statelessSession_ear, module=ejb20_basic_statelessSession.jar, ejb=statelessSession, method=sell, methodInterface=Remote, signature={java.lang.String,int}.
コード リスト 7-3 ユーザ Jen の出力 : create() メソッドでアクセス拒否
Buildfile: build.xml
run:
[java] username: Jen
[java] password: **********
[java] URL: t3://localhost:7001
[java] Creating a trader
[java] java.rmi.AccessException: Security violation: User Jen has insufficient permission to access method; nested exception is:
[java] java.lang.SecurityException: Security violation: User Jen has insufficient permission to access method
セキュリティ ポリシーで保護した EJB メソッドをクライアント アプリケーションが呼び出したため、このような結果になります。