JViews Web アプリケーションでのセキュリティー・メカニズムのカスタマイズ

デフォルトのセキュリティー・メカニズムでは要件を満たさない特別な状況において、独自の検証メカニズムを使用して、 JViews セキュリティー・メカニズムをカスタマイズすることができます。その独自のメカニズムにおいては、特定の要求についてデフォルトのパラメーター・リストから特定の要求パラメーターを追加あるいは削除することや、独自の検証ロジックおよび検証に不合格になったときの違反の処理方法を指定することができます。

カスタマイズ・パラメーター検証リスナーの挿入

カスタマイズ・パラメーター検証リスナーの挿入には 2 つの方法があります。 1 つは、注釈を使用して、特定のサーブレットに対するカスタマイズ・パラメーター検証リスナーを構成する方法で、もう 1 つは、 setParameterValidationListener メソッドを呼び出し、JViews サーブレット・サポート・メカニズムを使用して、カスタマイズ・パラメーター検証リスナーを投入する方法です。
  1. JViews サーブレット・クラスに対する注釈を使用して、カスタマイズ・パラメーター検証リスナーを構成します。 JViews 以降、以下に例を示すように、JViews サーブレット・クラスに対してサーバー・アクション・リスナーを構成する際に 8.8 注釈サポートが提供されています。
    @IlvServerActions(parameters = { 
    @IlvServerActionParam(actionName = IlvParameterValidationListener.ACTION_NAME, actionListener = MyServletParamValidationListener.class) })
    public class MyServlet extends IlvFacesDiagrammerServlet {...}
    
    この設定は、MyServlet の JViews サーブレット用にカスタマイズした MyServletParamValidationListener クラスを挿入します。サーバー・アクション・リスナーの構成に関して詳しくは、『サーバー・アクション・リスナーの管理』 を参照してください。
  2. サーブレット・サポート・クラスでオーバーライドすることで、カスタマイズ・パラメーター検証リスナーを構成します。 サーブレット・サポート・メカニズムを使用している場合、以下の例に示すように、setParameterValidationListener メソッドを呼び出して、カスタマイズ・パラメーター検証リスナーを挿入することができます。
    public class MyServlet extends IlvFacesDiagrammerServlet {
      public void init(ServletConfig config) throws ServletException {
        super.init(config);
      }
            
      public IlvSDMServletSupport createServletSupport(ServletContext context) {
        return new MyServletSupport(this.getServletContext());
      }
            
      class MyServletSupport extends IlvFacesDiagrammerServletSupport{
       public MyServletSupport(ServletContext context) {
          /*
           * Enable customized parameter validation by using servlet support class.
           */
          setParameterValidationListener(new MyServletParameterValidationListener());
        }
      }
      ...
    }
    この設定は、setParameterValidationListener メソッドをオーバーライドすることで、MyServlet の JViews サーブレット用にカスタマイズ MyServletParamValidationListener クラスを挿入します。

カスタマイズ・パラメーター検証リスナーの作成

要求パラメーターをカスタマイズ (特定のパラメーターの追加あるいは削除など) して、そのカスタマイズ検証メカニズムを使用したい場合、 以下の例に示すように、製品に付属で提供されている検証リスナーを拡張するカスタマイズ・パラメーター検証リスナーを作成する必要があります。
public class MyServletParamValidationListener extends IlvManagerServletParameterValidationListener {...}
詳細は、IlvManagerServletParameterValidationListener を参照してください。

要求パラメーターのカスタマイズ

各要求について、要求パラメーターのリストがデフォルトでサポートされています。 サポートされているパラメーターについて詳しくは、『JViews Web アプリケーションの交換プロトコルとセキュリティーの概要』を参照してください。状況によっては、要求パラメーターをカスタマイズする必要があることがあります。例えば、アプリケーションの特定の要求に対してパラメーターを追加あるいは削除することなどです。 そうしたカスタマイズは、要求パラメーター・ハンドラーを使用して実行できます。 以下の例は、親クラスの getServletParametersHandler メソッドをオーバーライドすることで、 image 要求に対して testParameter と呼ばれるカスタマイズ要求パラメーターを追加する方法を示します。
public class MyServletParamValidationListener extends
  IlvManagerServletParameterValidationListener {
      ...
    public IlvServletParameterHandler getServletParametersHandler(
      ServletRequest request) {
      String type = request.getParameter("request");
      IlvServletParameterHandler handler = null;
      // if you want to add more customized parameters for specific 
      // request types such as "image"
      if ("image".equals(type)) {
        // get the default parameter handler for the image request 
        // by using the factory class.
        handler = IlvManagerServletParameterHandlerFactory.getInstance()
          .getServletParametersHandler(request);
        // add a non-mandatory testing paramter called "testParameter" 
        // and an expected value of "expectedValue" under the specific 
        // comparator "List"
        handler.addParameter("testParameter", false, "expectedValue", 
          true,IlvRequestParameter.Comparator.LIST);
      } else {
        handler = super.getServletParametersHandler(request);
      }
    return handler;
  }
}
image 要求の場合、パラメーター・ハンドラー・ファクトリー・クラスを使用して、デフォルトのパラメーター・ ハンドラーを取得する必要があり、次に、testParameter という、必須ではないテスト・パラメーターと expectedValue という予期される値を特定のコンパレーター List の下に追加する必要があります。 このコンパレーターが、予期される値のリストを検証用の要求パラメーターと比較します。
各要求に、デフォルトでパラメーター・ハンドラーが用意されており、これがパラメーターの追加や削除などのパラメーター操作をサポートします。 サポートされる操作について詳しくは、IlvServletParameterHandlerを参照してください。要求パラメーターをカスタマイズするには、まずデフォルトのパラメーター・ハンドラーを取得する必要があります。 特定の要求に対する特定のパラメーター・ハンドラーを取得するには、パラメーター・ハンドラー・ファクトリー・クラスを使用することができます。
デフォルトのパラメーター・ハンドラーを取得するには、以下のようにします。
デフォルトのパラメーター・ハンドラーを取得するには、IlvManagerServletParameterHandlerFactory クラスを使用します。
リソースのロード時にパラメーター・ハンドラーを取得する場合は、 IlvResourceParameterHandlerFactory を使用します。
コンパレーターを指定するには、次のようにします。
特定のコンパレーターを true に設定することでパラメーター値を比較する方法を指定することができます。 デフォルトのコンパレーターは、EQUALS で、これは、要求されたパラメーター値が予期される値と等しくあるべきであることを意味します。 以下は、サポートされるコンパレーターのリストと、これらの使用方法を示すサンプル・コード・フラグメントです。 サポートされるコンパレーターについて詳しくは、 IlvRequestParameter を参照してください。
名前 説明 コード例
EQUALS パラメーター値は、予期された値と等しいです。 addParameter("format", true, "json", true, IlvRequestParameter.Comparator.EQUALS);
CONTAINS パラメーター値には、予期された値が含まれます。 addParameter("res", false, "data", true, IlvRequestParameter.Comparator.CONTAINS);
NOT_CONTAINS パラメーター値に、予期された値が含まれていません。 addParameter("image", false, "script", true, IlvRequestParameter.Comparator.NOT_CONTAINS);
STARTS_WITH パラメーター値は、リストにある予期された値の 1 つで始まり、値は、ストリング内でセミコロンで区切られています。 addParameter("res", true, "ilog", true, IlvRequestParameter.Comparator.STARTS_WITH);
ENDS_WITH パラメーター値は、リストにある予期された値の 1 つで終わり、値は、ストリング内でセミコロンで区切られています。 addParameter("res", true, ".gif;.jpg;.jpeg;.png;.js;.css", true, IlvRequestParameter.Comparator.ENDS_WITH);
LIST パラメーター値は、リストにある予期された値の 1 つであり、値は、ストリング内でセミコロンで区切られています。 addParameter("format", true, "JPEG;PNG;GIF;JPG", true, IlvRequestParameter.Comparator.LIST);

検証ロジックのカスタマイズ

パラメーター検証メカニズムが使用可能に設定されていると、各要求のパラメーター値が、デフォルトの検証ロジックを使用して、予期された値と比較されます。 このデフォルトの検証ロジックを変更したい場合、例えば、特定の要求に対して、より厳しいルールを除外、あるいは、追加したい場合は、ロジックをカスタマイズする必要があります。 以下の例は、親クラスで validate メソッドをオーバーライドすることで、 image 要求のカスタマイズ検証ロジックを追加する方法を示しています。
public class MyServletParamValidationListener extends
  IlvManagerServletParameterValidationListener {
      ...
    public boolean validate(HttpServletRequest request,
      HttpServletResponse response){
      String type = request.getParameter("request");
      //if you want to validate specific request type.
      if ("specificType".equals(type)) {
        /*
         * If you put error messages in request scope under the namespace of ERROR_MESSAGE.
         * the default handleViolation method can retrieve it and put it in the response. And 
         * the type of response is based on your request type.  
         */
        String errorMsg = "some error messages";      
        request.setAttribute(ERROR_MESSAGES, errorMsg);
        return false;
      } else {
        return super.validate(request, response);
      }
  }
   ...  
} 
エラー・メッセージが、要求の有効範囲の ERROR_MESSAGES の名前空間に含まれており、デフォルトの違反処理メソッドがそれを取得して応答に入れることができるようになっています。

違反処理のカスタマイズ

要求によって送信されたパラメーターがパラメーター検証で不合格になった場合、デフォルトの違反処理用のプロセスが適用されます。 デフォルトで、応答の形式は要求で予期されたものと同じです。 例えば、要求がイメージを予期している場合は、エラー・メッセージを含むイメージが返されます。 デフォルトのプロセスを変更したい場合、例えば、情報を追加したり、別のアクションを実行したい場合などは、違反処理をカスタマイズする必要があります。 以下の例は、親クラスで、handleViolation メソッドをオーバーライドすることで違反処理をカスタマイズする方法を示しています。
public class MyServletParamValidationListener extends
  IlvManagerServletParameterValidationListener {
      ...
  public void handleViolation(HttpServletRequest request,
    HttpServletResponse response) throws IOException {
    // gets error message from request attribute
    Object obj = request.getAttribute(ERROR_MESSAGES);
    String messages = obj == null ? "" : obj.toString();     
    String type = request.getParameter("request");
    if (type.equals("image")) {
      // perfom your customized action 
    }
  }
}
この例では、エラー・メッセージは、要求の有効範囲内の ERROR_MESSAGES 名前空間から取得されています。

参照用の例は、以下にあります。
file://../jviews-diagrammer89/codefragments/jsf-diagrammer-ice/index.html <installdir> /jviews-diagrammer89/codefragments/jsf-diagrammer-ice/index.html.