通常の日立APIポートレットの登録方法では,ポータルのユーザがURLを直接指定してポートレットおよびインラインオブジェクトにアクセスするおそれがあります。その場合,ポータルにアクセスしたユーザにJSPファイル,およびJSPファイルに含まれるインラインオブジェクトが表示されるおそれがあります。
ポートレットおよびインラインオブジェクトを,セキュリティを考慮してポータルで使用する方法について説明します。
(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) すべてのコンテンツをセキュアにする方法
<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>
{PROJECT_HOME}¥WEB-INF
<img src="/portlets/mailportlet/images/icon.gif">
<img src="/SecureContents?url=/portlets/mailportlet/images/icon.gif">
(b) 一部のコンテンツをセキュアにする方法
図A-4 一部のコンテンツをセキュアにするためのディレクトリ構成
<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>
{PROJECT_HOME}¥WEB-INF
<img src="/portlets/mailportlet/images/icon.gif">
<img src="/SecureContents?url=/portlets/mailportlet/images/icon.gif">