使用可能なプログラマチック・セキュリティー Java 2 Platform, Enterprise Edition (J2EE) アプリケーション・プログラミング・インターフェース (API) である、isUserInRole(String roleName) および isCallerInRole(String roleName) を使用する 場合、Web アプリケーション開発者または Enterprise JavaBeans (EJB) のプロバイダーは、 コード内で role-name を使用する必要があります。
デプロイ済みのランタイム環境で使用する役割は、Web アプリケーションおよび EJB コンポーネント (例えば Web アーカイブ (WAR) ファイルおよび ejb-jar.xml ファイル) がエンタープライズ・アーカイブ (EAR) ファイルにアセンブルされるまで不明である場合があります。このため、Web アプリケーション または EJB コンポーネントのコードで使用する役割名は、アプリケーシ ョンのアセンブリー中にアプリケーション・アセンブラーが実際のランタイム環境役割にマップする 論理役割名になります。 セキュリティー役割参照が提供する間接参照によって、Web アプリケーション・コンポーネントと EJB の開発者は、ランタイム環境における実際の役割を意識する必要がなくなります。
「論理」役割の定義と、実際のランタイム環境の役割への論理役割のマッピングについては、 Web アプリケーションと EJB JAR ファイル (それぞれ、web.xml と ejb-jar.xml) の両方のデプロイメント記述子内の security-role-ref エレメントに指定されています。 アセンブリー・ツールは、役割名を定義し、role-link エレメントを使用して役割名をその環境の実際のランタイム役割へマップすることができます。
... <enterprise-beans> ... <entity> <ejb-name>AardvarkPayroll</ejb-name> <ejb-class>com.aardvark.payroll.PayrollBean</ejb-class> ... <security-role-ref> <description>この役割は、給与計算部門の従業員に割り当てられます。 この役割のメンバーは、全員の給与計算レコードへのアクセス権を持っています。 この役割は、payroll-department 役割にリンクされています。 この役割は、給与計算部門の従業員に割り当てられます。 この役割のメンバーは、すべての給与計算レコードへのアクセス権を持っています。この役割は、payroll-department 役割にリンクされています。
</description> <role-name>payroll</role-name> <role-link>payroll-department</role-link> </security-role-ref> ... </entity> ... </enterprise-beans>
上記の例では、<role-name> エレメント内に表示されるストリング payroll は、 EJB プロバイダーが isCallerInRole() API への引数として使用するものです。<role-link> エレメントは、論理役割と ランタイム環境で使用される実際の役割を結び付けます。
Enterprise Bean の場合、論理的な役割名が環境内の実際の役割名と同じ場合でも、 security-role-ref はデプロイメント記述子に指定されていなくてはなりません。
Web アプリケーション・コンポーネントの場合のルールは、やや異なります。security-role エレメントと一致する security-role-ref エレメントが宣言されていない場合、 コンテナーはデフォルトで、Web アプリケーションの security-role エレメントのリストに 対する role-name エレメント引数を検査する必要があります。isUserInRole メソッドは、リストを参照して、 呼び出し元がセキュリティー役割にマップされるかどうかを決めます。 開発者は、このデフォルト・メカニズムを使用する場合、呼び出しを行うサーブレットを再コンパイルしないと、 アプリケーション内の役割名を変更する場合の柔軟性が損なわれることがあることに注意してください。
この仕様の詳細については、『セキュリティー: 学習用リソース』の EJB バージョン 2.0 および サーブレット・バージョン 2.3 の仕様を参照してください。