TERASOLUNAのセキュリティ機能でWebアプリを強化オープンソースTERASOLUNAで作るWebアプリ(5)(2/3 ページ)

» 2009年03月10日 00時00分 公開
[佐々木高洋株式会社NTTデータ]

画面ファイルの作成

 ログオン画面と、ログオン成功画面を作成します。ログオン画面ではユーザーIDを入力します。

リスト4 ログオン画面(logon.jsp)
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ taglib uri="/struts-html" prefix="html"%>
<%@ taglib uri="/terasoluna-struts" prefix="ts"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
  <title>ログオン画面</title>
</head>
<ts:body>
  <ts:form action="/logonBL">
    ユーザーID:<html:text property="userId" />
    <ts:submit value="送信" />
  </ts:form>
</ts:body>
</html:html>

 ログオン成功画面では、セッションからUVOを取得してユーザー情報を表示します。

リスト5 ログオン成功画面(certified.jsp)
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ taglib uri="/struts-html" prefix="html"%>
<%@ taglib uri="/struts-bean" prefix="bean"%>
<%@ taglib uri="/struts-logic" prefix="logic"%>
<%@ taglib uri="/terasoluna-struts" prefix="ts"%>
<%@ taglib uri="/terasoluna" prefix="t"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html>
<head>
  <meta http-equiv="Content-Type" content="text/html;
    charset=shift_jis">
  <title>ログオン画面</title>
</head>
<ts:body>
  <ts:form action="listBL">
    ログオン成功<br />
    ユーザーID:
    <bean:write name="USER_VALUE_OBJECT" property="userId"
      scope="session" />
    <br />
    ユーザー名:
    <bean:write name="USER_VALUE_OBJECT" property="userName"
      scope="session" />
    <br />
    年齢:
    <bean:write name="USER_VALUE_OBJECT" property="age"
      scope="session" />
    <br />
    <ts:submit>ユーザー一覧</ts:submit>
    <br />
    <ts:link action="/logonSCR">ログオン画面へ戻る</ts:link>
  </ts:form>
</ts:body>
</html:html>

業務入出力クラスの作成

リスト6 業務入力クラス(LogonInput.java)
package sample2;

public class LogonInput {
    // ユーザーID
    private String userId;

    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
}

リスト7 業務出力クラス(LogonOutput.java)
package sample;
package sample2;

public class LogonOutput {
    // ユーザー情報オブジェクト
    private SampleUVO uvo;

    public SampleUVO getUvo() {
        return uvo;
    }
     public void setUvo(SampleUVO uvo) {
        this.uvo = uvo;
    }
}

Struts設定ファイルへの追記

リスト8 struts-config.xml(form-beans要素)
  <form-bean name="logon"
    type="jp.terasoluna.fw.web.struts.form.DynaValidatorActionFormEx">
    <form-property name="userId" type="java.lang.String"/>
  </form-bean>

リスト9 struts-config.xml(action-mappings要素)
  <action path="/logonBL" name="logon">
    <forward name="success" path="/logonSuccessSCR.do"/>
    <forward name="failure" path="/logonSCR.do"/>
  </action>
  <action path="/logonSCR" parameter="logon.jsp" />
  <action path="/logonSuccessSCR" parameter="logonSuccess.jsp" />

そのほかのXMLファイルへの追記

 SQL定義ファイルに、ユーザーを検索するSQLを記述します。

リスト10 sqlMap.xml(sqlMap.xml)
  <select id="getUser" parameterClass="java.lang.String"
    resultClass="sample2.UserBean">
    SELECT ID AS "userId", NAME AS "userName", AGE AS "age"
    FROM USERLIST WHERE id = #value
#
  </select>

リスト11 Bean定義ファイル(moduleContext.xml)
  <bean class="jp.terasoluna.fw.web.struts.actions.BLogicAction"
    name="/logonBL" scope="singleton">
    <property name="businessLogic" ref="logonBLogic" />
  </bean>
  <bean class="sample2.LogonBLogic" id="logonBLogic"
    scope="singleton">
    <property name="queryDAO" ref="queryDAO" />
  </bean>
  <bean name="/logonSCR" scope="singleton"
    class="jp.terasoluna.fw.web.struts.actions.ForwardAction" />
  <bean name="/certifiedSCR" scope="singleton"
    class="jp.terasoluna.fw.web.struts.actions.ForwardAction" />

ログオン処理の確認

 動作確認してみましょう。Webブラウザに以下のURLを入力します。

  • http://localhost:8080/terasoluna-sample/logonSCR.do

 ログオン画面が表示されます(図3)。

図3 ログオン画面 図3 ログオン画面

 ユーザーID(1〜40)を入力すると、ログオン成功画面に遷移します(図4)。

図4 ログオン成功画面 図4 ログオン成功画面

特定アクセスの画面を作る「アクセス権限チェック機能」

 例えば管理者専用画面のように、ユーザー権限によってアクセス可否を制御したいことがあります。そのようなときは「アクセス権限チェック機能」を使用します。

 例として、ユーザー一覧画面へのアクセスを制限してみましょう。ユーザーIDが10以上のユーザーに対して、以下のようなアクセス制限を掛けます。

  • ユーザー一覧画面にアクセスできない
  • ログオン成功画面からユーザー一覧画面への遷移ボタンが表示されない

実装概要

 アクセス権限チェックはサーブレットフィルタを用いて実現されています。開発者が実装するのは以下の2つのチェックロジックです。

  1. メソッド「boolean isCheckRequired(ServletRequest)」
    アクセス権限チェックを掛けるべきリクエストかどうかを判断。falseを返すとアクセス権限チェックは実行されない。今回は、リクエストパスが「/list」で始まる場合はtrueを返す(チェックが必要)とする
  2. メソッド「boolean isAuthorized(String, ServletRequest)」
    アクセス権限の有無を判断。falseを返すとアクセス権限なしとして、例外UnauthorizedExceptionがスローされる。今回は、ユーザーIDが9以下であればtrueを返す(アクセス権がある)とする

 アクセス権限チェックのクラスは、インターフェイス「jp.terasoluna.fw.web.thin.AuthorizationController」を実装して作成します。

図5 アクセス権限チェックイメージ 図5 アクセス権限チェックイメージ

 それでは、次ページで実装して動作確認をしてみましょう。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。