セキュリティー・アノテーション

アノテーションは、JSR-175 勧告に由来する強力なプログラミング手段です。 アノテーションは、サポートされるセキュリティーの振る舞いを組み込むと同時に、ソース・コードおよび構成ファイルの自動生成を可能にする、標準的な方法です。

Java™ Platform, Enterprise Edition (Java EE) 5 以降では、セキュリティー・ロールおよびポリシーは、デプロイメント記述子内でも、アノテーションを使用しても定義できます。 アプリケーションのインストール時に、アノテーションを使用して定義されたセキュリティー・ポリシーおよびロールは、デプロイメント記述子内で定義されたセキュリティー・ポリシーおよびロールとマージされます。 このマージは、Annotations Metadata Manager (AMM) 機能によって実行されます。 メタデータがマージされる際には、以下の継承規則が順守されます。
表 1. メタデータ・マージの継承規則.

次の表は、メタデータ・マージの継承規則をリストしています。

シナリオ 規則
デプロイメント記述子内のセキュリティー・メタデータのみ マージは必要ありません。デプロイメント記述子からのセキュリティー・メタデータは伝搬されます。
アノテーション内のセキュリティー・メタデータのみ マージは必要ありません。アノテーションで定義されたセキュリティー・メタデータは伝搬されます。
デプロイメント記述子およびアノテーション内のセキュリティー・メタデータ デプロイメント記述子およびアノテーションからのメタデータがマージされます。 アノテーション内のメタデータは、デプロイメント記述子からの同一タイプのデータによってオーバーライドされます。
現在、6 個のセキュリティー・アノテーションがサポートされています。 それぞれのアノテーションに、MergeAction 実装が定義されています。
  • @DeclareRoles (サーブレット 2.5 以上および EJB 3)

    MergeAction 実装は、DeclareRoles アノテーションでアノテーションを付けられたすべてのクラスを検出します。 アノテーションを付けられた各クラス内で、指定されたロール名ごとに、 デプロイメント記述子内にリストされたセキュリティー・ロールに、 アノテーションを付けられたロール名を持つ SecurityRole が含まれていない場合は、 新規 SecurityRole が作成され、このセキュリティー・ロールのリストに追加されます。

  • @RunAs (サーブレット 2.5 以上および EJB 3)

    MergeAction 実装は RunAs アノテーションの付いたすべてのクラスを検出します。 アノテーションを付けられたクラスごとに、特定のクラスに関連付けられたサーブレット または Enterprise Java Bean (EJB) を検出します。 その後で、サーブレットまたは EJB に対するデプロイメント記述子内に、run-as エレメントが定義されているかどうかを判別します。 run-as エレメントが検出されない場合は、新規 run-as エレメントが作成され、デプロイメント記述子に追加されます。 run-as エレメントが検出された場合は、新規 run-as エレメントは作成されずに、この run-as エレメントが使用されます。 RunAs アノテーション内で使用されるロール名は、デプロイメント記述子内で定義される必要があります。

  • @DenyAll (EJB 3 のみ)

    MergeAction 実装は 実装は、DenyAll アノテーションでアノテーションを付けられたすべてのメソッドを検出します。 アノテーションを付けられたメソッドごとに、メソッドが、除外メソッドのデプロイメント記述子リスト内に含まれていない場合で、MethodPermission がデプロイメント記述子内に存在しない場合は、新規 MethodElement が作成され、デプロイメント記述子内のこの除外メソッドのリストに追加されます。

  • @PermitAll (EJB 3 のみ)

    MergeAction 実装は PermitAll アノテーションの付いたすべてのクラスとメソッドを検出します。 アノテーションを付けられたクラスごとに、 特定のクラスに関連付けられた Enterprise Java Bean (EJB) を検出します。 その後で、この EJB に対するデプロイメント記述子内で定義されたすべての MethodPermissions のリスト内で、MethodElements のサブセットを検索します。 ワイルドカード・メソッド名 (“*") の付いた MethodElement が検出されず、ワイルドカード・メソッドが、除外メソッドのリスト、またはセキュリティー・ロールの付いた MethodElements のリスト内に存在しない場合は、新規 MethodPermission および新規 MethodElement が作成されます。新規 MethodPermission は未チェックとしてマークされ、デプロイメント記述子内の MethodPermission リストに追加されます。 新規 MethodElement は、新規に作成された未チェックの MethodPermission の MethodElement リストに追加されます。 同様のアクションが、すべてのアノテーション付きメソッドに対して行われます。 ワイルドカード MethodElement の代わりに、メソッド・シグニチャーが、 アノテーション付きメソッドのシグニチャーと正確に一致する必要があります。

  • @RolesAllowed (EJB 3 のみ)

    MergeAction 実装は、RolesAllowed アノテーションの付いたすべてのクラスとメソッドを検出します。 アノテーションを付けられたクラスごとに、特定のクラスに関連付けられた EJB を検出します。 その後で、この EJB に対するデプロイメント記述子内で定義されたすべての MethodPermissions のリスト内で、MethodElements のサブセットを検出します。 ワイルドカード・メソッド名 (“*”) の付いた MethodElement が検出されず、ワイルドカード・メソッドが、除外メソッドのリスト、または未チェックの MethodElements のリスト内に存在しない場合は、新規の MethodPermission および MethodElement が作成されます。 この EJB に対する MethodPermission が、アノテーション内に検出されたロールとまったく同一のロール付きで存在する場合は、新規に作成せずに、この MethodPermission が使用されます。 アノテーション内に指定されたロール名ごとに、新規 SecurityRole が作成され、MethodPermission 内の SecurityRole リストに追加されます。 MethodPermission が新規に作成された場合、MethodPermission は、デプロイメント記述子内の MethodPermission リストに追加されます。 新規に作成された MethodElement は、 MethodPermission の MethodElement リストに追加されます。同様の処理が、すべてのアノテーション付きメソッドに対して行われます。 ワイルドカード MethodElement の代わりに、メソッド・シグニチャーが、アノテーション付きメソッドのシグニチャーと正確に一致する必要があります。また、アノテーション内に指定されたロール名ごとに、セキュリティー・ロールのデプロイメント記述子リストに、アノテーションを付けられたロール名の付いた SecurityRole が含まれていない場合にも、新規 SecurityRole が作成され、このセキュリティー・ロールのリストに追加されます。

  • @ServletSecurity (サーブレット 3.0 のみ)
    注: Servlet 3.0 の ServletSecurity アノテーションの サポートは、このリリースの WebSphere® Application Server の新機能です。

    アプリケーションをデプロイすると、ServletSecurity MergeAction 実装は、 ServletSecurity アノテーションが付いているすべてのサーブレットを検出します。アノテーションが付いている サーブレットごとに、WebServlet アノテーションに基づいて、特定のクラスに関連付けられたサーブレットを検出します。 デプロイメント記述子内に ServletSecurity アノテーションの RolesAllowed が検出されない場合は、 デプロイメント記述子内にロールの role-name 属性が作成されます。

    アプリケーションが開始されると、WebContainer は RunAs アノテーション、declareRoles アノテーション、および ServletSecurity アノテーションが付いているすべてのサーブレットを検査し、これらのアノテーションを ServletRegistration アノテーションの setServletSecurity() メソッドに設定します。WebContainer は、セキュリティー・コンポーネントに、 URL パターンおよびセキュリティー制約を持つすべての ServletRegistration アノテーションを検査するように 通知します。セキュリティー・コンポーネントは、デプロイメント記述子内に URL パターンが定義されているか どうかを判別します。デプロイメント記述子内に URL パターンが定義されていない場合、セキュリティー制約および RunAs ロールが URL パターンで作成されて使用されます。デプロイメント記述子内に完全に一致する URL パターンが既に定義されている場合は、 デプロイメント記述子の URL パターン内のセキュリティー制約および RunAs ロールが、アノテーション・データ の代わりに使用されます。

    注: Web 認証システム・プロパティー com.ibm.wsspi.security.web.webAuthReq が persisting に設定されている場合は、 有効なユーザー名およびパスワードを指定すると、無保護 URL にログインできます。

    Inherited サーブレット・アノテーション は、メタデータ・アノテーションです。Inherited アノテーションをクラス内で指定しないでください。サブクラスにセキュリティー・アノテーションがない場合、サブクラスは親クラスから自動的にセキュリティー・アノテーションを継承します。サブクラスは、そのサブクラスのセキュリティー・アノテーションを指定することにより、 親のセキュリティー・アノテーションを上書きできます。

    以下に、すべての HTTP メソッドに制約がない場合の例を示します。
    @WebServlet ("/Example") 
    @ServletSecurity
    public class Example extends HttpServlet {
           ……
    }
    すべての HTTP メソッドに <auth-constraint> エレメントがなく、機密 TransportGuarantee が必要な例を以下に示します。
    @WebServlet ("/Example")
    @ServletSecurity(@HttpConstraint(transportGuarantee =
                          TransportGuarantee.CONFIDENTIAL))
    public class Example extends HttpServlet {
           ……
    }
    以下に、すべての HTTP メソッドについてアクセスを拒否する場合の例を示します。
    @WebServlet ("/Example")
    @ServletSecurity(@HttpConstraint(EmptyRoleSemantic.DENY))
    public class Example extends HttpServlet {
           ……
    }
    以下に、GET および POST 値以外の HTTP メソッドには 制約がない場合の例を示します。GET の場合、<auth-constraint> エレメントに ALL ROLE のメンバーシップが必要です。POST の場合には、すべてのアクセスが拒否されます。
    @WebServlet (name="Example", urlPatterns={"/Example"}) 
    @ServletSecurity((httpMethodConstraints = {
    		@HttpMethodConstraint(value = "GET", rolesAllowed = “ALL ROLE"),
    		@HttpMethodConstraint(value="POST“, emptyRoleSemantic =
    EmptyRoleSemantic.DENY))
    })
    public class Example extends HttpServlet {
           ……
    }
    GET 値を除くすべての HTTP メソッドの例を以下に示します。<auth-constraint> エレメントに ALL ROLE のメンバーシップが必要であり、GET メソッドには制約がありません。
    @WebServlet (name="Example", urlPatterns={"/Example"}) 
    @ServletSecurity(value = @HttpConstraint(rolesAllowed = "ALL ROLE"),
    		httpMethodConstraints = @HttpMethodConstraint("GET"))
    public class Example extends HttpServlet {
           ……
    }
    TRACE を除くすべての HTTP メソッドの例を以下に示します。<auth-constraint> エレメントに ALL ROLE のメンバーシップが必要であり、TRACE ではすべてのアクセスが拒否されます。
    @WebServlet (name="Example", urlPatterns={"/Example"}) 
    @ServletSecurity(value = @HttpConstraint(rolesAllowed = "ALL ROLE"),
    		httpMethodConstraints = @HttpMethodConstraint(value="TRACE",
    		emptyRoleSemantic = EmptyRoleSemantic.DENY))
    public class Example extends HttpServlet {
           ……
    }

トピックのタイプを示すアイコン 概念トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=csec_annotations
ファイル名:csec_annotations.html