8.2.3. セキュリティーアイデンティティー
Enterprise Java Bean(EJB)は、<security-identity> 要素を使用してコンポーネントでメソッドを呼び出すときに別の EJB を使用する必要があります。
図8.2 Java EE Security Identity データモデル
呼び出しアイデンティティーは、現在の呼び出し元または特定のロールになります。アプリケーションアセンブラーは、<security-identity> 子要素で <use-caller-identity> 要素を使用します。これは、現在の呼び出し元のアイデンティティーを EJB によるメソッド呼び出しのセキュリティーアイデンティティーとして伝播する必要があることを示します。呼び出し元のアイデンティティーの伝搬は、明示的な <security-identity> 要素宣言がない場合に使用されるデフォルトです。
または、アプリケーションアセンブラーは <run-as> または <role-name> 子要素を使用して、<role-name> 要素値によって提供される特定のセキュリティーロールを EJB によるメソッド呼び出しのセキュリティーアイデンティティーとして使用する必要があると指定できます。
これにより、
EJBContext.getCallerPrincipal() メソッドが示すように呼び出し元のアイデンティティーは変更されません。代わりに、呼び出し元のセキュリティーロールは、<run-as> または <role-name> 要素の値で指定された単一のロールに設定されます。
<run-as> 要素のユースケースの 1 つは、外部クライアントが内部 EJB にアクセスできないようにします。この動作は、外部クライアントに割り当てられないロールへのアクセスを制限する内部 EJB <method-permission> 要素を割り当てます。その後、内部 EJB を使用する EJB は、restricted ロールと同等の <run-as> または <role-name> で設定されます。以下の記述子フラグメントは、<security-identity> 要素の使用例を示しています。
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>ASessionBean</ejb-name>
<!-- ... -->
<security-identity>
<use-caller-identity/>
</security-identity>
</session>
<session>
<ejb-name>RunAsBean</ejb-name>
<!-- ... -->
<security-identity>
<run-as>
<description>A private internal role</description>
<role-name>InternalRole</role-name>
</run-as>
</security-identity>
</session>
</enterprise-beans>
<!-- ... -->
</ejb-jar>
<run-as> を使用して送信呼び出しに特定のロールを割り当てると、
anonymous という名前のプリンシパルがすべて送信呼び出しに割り当てられます。呼び出しに別のプリンシパルを関連付ける場合は、<run-as-principal> を jboss-ejb3.xml ファイルの Bean に関連付ける必要があります。以下のフラグメントは、前の例の internal という名前のプリンシパルを RunAsBean に関連付けます。
<session>
<ejb-name>RunAsBean</ejb-name>
<security-identity>
<run-as-principal>internal</run-as-principal>
</security-identity>
</session>
<run-as> 要素は
web.xml ファイルのサーブレット定義でも利用可能です。以下の例は、InternalRole ロールをサーブレットに割り当てる方法を示しています。
<servlet>
<servlet-name>AServlet</servlet-name>
<!-- ... -->
<run-as>
<role-name>InternalRole</role-name>
</run-as>
</servlet>
このサーブレットからの呼び出しは、匿名
プリンシパル に関連付けられます。<run-as-principal> 要素は jboss-web.xml ファイルで利用でき、run-as ロールとともに特定のプリンシパルを割り当てます。以下の例は、internal という名前のプリンシパルを上記のサーブレットに関連付ける方法を示しています。
<servlet>
<servlet-name>AServlet</servlet-name>
<run-as-principal>internal</run-as-principal>
</servlet>