連載
» 2009年03月10日 00時00分 公開

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

[佐々木高洋,株式会社NTTデータ]

 前回の「TERASOLUNAのタグで検索結果ページリンクを簡単に」から、TERASOLUNA Server Framework for Java Web版(以下、TERASOLUNAフレームワーク)の応用編として、TERASOLUNAフレームワークが持っているWebアプリケーション開発に役立つさまざまな機能を紹介しています。

編集部注:TERASOLUNA Server Framework for Java」を含むTERASOLUNA全体について詳しく知りたい読者は、特集「Java、.NET、Ajax開発の“銀の弾丸”オープンソース?」をご覧ください。

 連載最終回の今回は、以下2つのセキュリティ機能を紹介します。

  • ユーザー情報保持機能
  • アクセス権限チェック機能

 これまでと同様に、実際にWebアプリケーションを構築しながらこれらの機能を使っていきましょう。構築環境については、連載第3回の「iBATISのORMとSpringのAOPを活用したDBアクセス」を参照しておいてください。

ログオンした情報を管理する「ユーザー情報保持機能」

 TERASOLUNAフレームワークでは、ユーザーの名前や権限などのユーザー固有情報を、セッションの「UVO(User Value Object)」と呼ばれるオブジェクトに保持します。UVOを使用することで、ユーザー情報は各業務から共通的に参照できるようになります。

 また、ユーザーごとのアクセス制御などの機能も実現できます。UVOを利用して、前回作成した一覧表示アプリケーションに、ログオン処理を追加してみましょう。

実装概要

 ログオン画面でユーザーIDを入力して、ログオンに成功した場合に一覧表示画面に遷移する処理を作成します。

図1 ログオン処理イメージ 図1 ログオン処理イメージ

 入力されたユーザーIDに対して、該当する行がテーブルに存在すればログオン成功と判断します。ログオン成功した場合はUVOを生成します。追加・変更するファイルは以下のとおりです。

図2 追加・変更するファイル 図2 追加・変更するファイル

UVOを定義する

 ユーザー情報を格納するクラスを作成します。jp.terasoluna.fw.web.UserValueObjectを継承して、必要なプロパティを定義します。

リスト1 SampleUVO.java
package sample2;

import jp.terasoluna.fw.web.UserValueObject;

public class SampleUVO extends UserValueObject {

    // ユーザーID
    private String userId;
    // ユーザー名
    private String userName;
    // 年齢
    private String age;

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

    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
}

 作成したクラスをUVOとして定義するには、プロパティ「user.value.object」を定義します。sourcesフォルダ直下のsystem.propertiesに以下の1行を追加します。

    user.value.object=sample2.SampleUVO

UVOを生成してセッションへ保存する

 ログオン業務ロジックには、以下の実装をします。

  1. 入力されたユーザーIDでテーブルを検索して、ユーザー情報を取得
  2. (ユーザー情報があれば)UVOを生成してユーザー情報を格納
リスト2 業務ロジッククラス(LogonBLogic.java)
package sample2;

import jp.terasoluna.fw.dao.QueryDAO;
import jp.terasoluna.fw.service.thin.BLogic;
import jp.terasoluna.fw.service.thin.BLogicResult;
import jp.terasoluna.fw.web.UserValueObject;

public class LogonBLogic implements BLogic<LogonInput> {
    private QueryDAO queryDAO;

    public void setQueryDAO(QueryDAO queryDAO) {
        this.queryDAO = queryDAO;
    }

    public BLogicResult execute(LogonInput param) {
        String userId = param.getUserId();

        // ユーザーIDでテーブルを検索
        UserBean user = queryDAO.executeForObject("getUser",
            userId,UserBean.class);

        // ユーザーIDがDB上になければログオン失敗とする
        if (user == null) {
            BLogicResult result = new BLogicResult();
            result.setResultString("failure");
            return result;
        }

        // UVOを生成
        SampleUVO uvo = (SampleUVO) UserValueObject.
            createUserValueObject();
        uvo.setUserId(userId);
        uvo.setUserName(user.getUserName());
        uvo.setAge(user.getAge());

        // 業務出力クラスを作成
        LogonOutput output = new LogonOutput();
        output.setUvo(uvo);

        BLogicResult result = new BLogicResult();
        result.setResultObject(output);
        result.setResultString("success");

        return result;
    }
}

 業務入出力ファイルに、業務ロジックが出力したUVOをセッションに格納する設定を記述します。

リスト3 業務入出力ファイル(blogic-io.xml)
  <action path="/logonBL">
    <blogic-params bean-name="sample.LogonInput">
      <set-property property="userId" source="form" />
    </blogic-params>
    <blogic-result>
      <set-property property="USER_VALUE_OBJECT"
        blogic-property="uvo" dest="session" />
    </blogic-result>
  </action>

 次ページでは、ほかに必要なファイルを示し、実行してみます。さらに、もう1つの「アクセス権限チェック機能」について解説します。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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