付録A.12 セキュアなポートレットの開発

通常の日立APIポートレットの登録方法では,ポータルのユーザがURLを直接指定してポートレットおよびインラインオブジェクトにアクセスするおそれがあります。その場合,ポータルにアクセスしたユーザにJSPファイル,およびJSPファイルに含まれるインラインオブジェクトが表示されるおそれがあります。

ポートレットおよびインラインオブジェクトを,セキュリティを考慮してポータルで使用する方法について説明します。

<この項の構成>
(1) アクセス判定するサーブレットの作成
(2) セキュアなポートレットの設定

(1) アクセス判定するサーブレットの作成

セキュアなポートレットを作成するには,アクセス判定するサーブレットを作成します。サーブレット内のコードのうち,アクセス判定の基準として,ユーザ情報取得Beanも使用できます。ユーザ情報取得Beanについては,「14.6 ユーザ情報取得Bean」を参照してください。

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import jp.co.hitachi.soft.portal.api.user.PortalUserInfoBean;
import java.net.*;
public class securecontents extends HttpServlet {
   public void doGet(HttpServletRequest req, HttpServletResponse res){
     try{
       ServletOutputStream out = res.getOutputStream();
       String url = req.getParameter("url");
         // サイトのエンコーディングがShift_JISの場合,次の処理を行う。
       url = new String(url.getBytes("iso-8859-1"),"Windows-31J");
       PortalUserInfoBean puibean = new PortalUserInfoBean();
       puibean.setRequest(req);
       String userid = puibean.getUserId();
       if (  アクセス判定 == true ){
           if ( url.endsWith("jsp") ){
               req.getRequestDispatcher(url).forward(req,res);
           }else{
               java.net.URL nurl = getServletContext().getResource(url);
               java.net.URLConnection urlc = nurl.openConnection();
               res.setContentLength(urlc.getContentLength());
               res.setContentType(urlc.getContentType());
               byte  barray[] = new byte[urlc.getContentLength()];
               InputStream is = urlc.getInputStream();
               is.read(barray);
               out.write(barray);
         }
       }else{
               // アクセス拒否の応答を返却する
               res.setStatus(404);
               out.print("access error");
       }
     }catch(Exception e){}
   }
}

(2) セキュアなポートレットの設定

セキュアなポートレットを作成するには,次の方法があります。

すべてのコンテンツをセキュアにする場合,セキュリティ強度は上がりますが,Webサーバの負荷も上がります。

環境に応じて,どちらの方法を選択するかを決定します。

(a) すべてのコンテンツをセキュアにする方法

  1. WebアプリケーションのDD(web.xml)を設定する
    web.xmlに次の設定を追加します。

    <web-app>
       ...
    <security-constraint>
       <web-resource-collection>
           <web-resource-name>Protected Area</web-resource-name>
           <url-pattern>(URL)</url-pattern>
           <http-method>GET</http-method>
           <http-method>POST</http-method>
           <auth-constraint>
               <role-name>dummy</role-name>
           </auth-constraint>
       </web-resource-collection>
    </security-constraint>
    </web-app>

    <url-pattern>(URL)</url-pattern>
    (URL)には,ポートレットディレクトリ下のすべてのディレクトリを指定します。
    例:/portlets/mailportlet/*
    <auth-constraint>
    <role-name>には実在しないロールを指定します。
    web.xmlの格納場所を次に示します。

    {PROJECT_HOME}¥WEB-INF

  2. URLの記述形式を変更する
    アクセス判定するサーブレット経由でコンテンツを呼び出す設定に変更します。
    ポートレットユティリティタグライブラリを用いて画面内遷移しているポートレットは,変更する必要はありません。
    セキュアにするコンテンツを参照しているすべてのファイルで,参照先URLを次の形式に変更します。変更後は,ポートレットユティリティタグライブラリは使用できません。
    / SecureContents?url=(URL)
    変更例を次に示します。
    変更前

    <img src="/portlets/mailportlet/images/icon.gif">

    変更後

    <img src="/SecureContents?url=/portlets/mailportlet/images/icon.gif">

(b) 一部のコンテンツをセキュアにする方法

  1. ディレクトリ構成を次のとおりに作成する
    一部のコンテンツをセキュアにするためのディレクトリ構成を次の図に示します。

    図A-4 一部のコンテンツをセキュアにするためのディレクトリ構成

    [図データ]

  2. WebアプリケーションのDD(web.xml)を設定する
    web.xmlに次の設定を追加します。

    <web-app>
    ...
    <security-constraint>
       <web-resource-collection>
           <web-resource-name>Protected Area</web-resource-name>
           <url-pattern>(URL)</url-pattern>
           <http-method>GET</http-method>
           <http-method>POST</http-method>
           <auth-constraint>
               <role-name>dummy</role-name>
           </auth-constraint>
       </web-resource-collection>
    </security-constraint>
    </web-app>

    <url-pattern>(URL)</url-pattern>
    (URL)には,セキュアにするコンテンツのディレクトリを指定します。
    例:/portlets/mailportlet/secure/*
    <auth-constraint>
    <role-name>には実在しないロールを指定します。
    web.xmlの格納場所を次に示します。

    {PROJECT_HOME}¥WEB-INF

  3. URLの記述形式を変更する
    アクセス判定するサーブレット経由でコンテンツを呼び出す設定に変更します。
    ポートレットユティリティタグライブラリを用いて画面内遷移しているポートレットは,変更する必要はありません。
    セキュアにするコンテンツを参照しているすべてのファイルで,参照先URLを次の形式に変更します。変更後は,ポートレットユティリティタグライブラリは使用できません。
    / SecureContents?url=(URL)
    変更例を次に示します。
    変更前

    <img src="/portlets/mailportlet/images/icon.gif">

    変更後

    <img src="/SecureContents?url=/portlets/mailportlet/images/icon.gif">