目次 > 第2章 Server(Web)版チュートリアル >  2.12 アクセス制御 > 2.12.1 アクセスコントローラクラスの作成と設定

2.12.1 アクセスコントローラクラスの作成と設定

Server(Web)版が提供するアクセス制御機能は、リクエストごとの前処理にてアクセスを制御する。アクセス制御の流れを以下に示す。


アクセス制御の流れ


  1. ブラウザからのリクエストをアクセスフィルタが受け取る。
  2. アクセスフィルタは、アクセスコントローラを呼び出す。
  3. アクセスコントローラでリクエストに対するアクセスチェックを実施し、結果をアクセスフィルタに返却する。
  4. 返却された結果により、アクセスフィルタで処理を振り分ける。

Server(Web)版では、以下のアクセスフィルタクラスとアクセスコントローラのインタフェースを提供している。

機能アクセスフィルタクラスアクセスコントローラインタフェース
ログオン済みチェックAuthenticationControlFilterAuthenticationController
アクセス権限チェックAuthorizationControlFilterAuthorizationController
業務閉塞チェックBlockageControlFilterBlockageController
サーバ閉塞チェックServerBlockageFilterServerBlockageController
拡張子直接指定禁止ExtensionFilterなし(フィルタクラス単体で動作する)


本項では、ログオン済みチェックのアクセスコントローラクラスの作成と設定手順について説明する。

手順

本項では以下の作業が必要になる。

(1) アプリケーションリソースファイルの編集

ログオン済みチェックを実施しないリクエストパスを設定する。

  1. “terasoluna-spring-thin-blank\sources\ApplicationResources.properties”を開き、以下の設定を追加する。
    #認証を行わないパスを記述
    access.control.authenticated.escape.1=/logon/logonSCR.do
    access.control.authenticated.escape.2=/logon/logoff.do
    access.control.authenticated.escape.3=/error.do
    access.control.authenticated.escape.4=/error.jsp
    access.control.authenticated.escape.5=/image/terasoluna_logo.gif
    access.control.authenticated.escape.6=/welcome.do
    access.control.authenticated.escape.7=/logon/logonBL.do
    

キー名は、必ず連番となるように注意すること。

(2) アクセスコントローラクラスの作成

チェック処理を実装するアクションコントローラクラスを作成する。

  1. “terasoluna-spring-thin-blank\sources”を右クリックする。
  2. 「新規」→「クラス」を選択する。
  3. 以下の通り入力し、「終了」ボタンを押下する。
    • パッケージ:jp.terasoluna.thin.tutorial.web.common.controller
    • 名前:TutorialAuthController
    • インターフェース:jp.terasoluna.fw.web.thin.AuthenticationController
  4. 生成されたTutorialAuthControllerクラスを以下のように編集する。
    package jp.terasoluna.thin.tutorial.web.common.controller;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.ServletRequest;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    import jp.terasoluna.fw.util.PropertyUtil;
    import jp.terasoluna.fw.web.RequestUtil;
    import jp.terasoluna.fw.web.thin.AuthenticationController;
    import jp.terasoluna.thin.tutorial.web.common.uvo.TutorialUVO;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    /**
     * 認証チェックを行う。
     * 
     */
    public class TutorialAuthController implements AuthenticationController {
    
        /**
         * ログクラス
         */
        private static Log log =
            LogFactory.getLog(TutorialAuthController.class);
    
        /**
         *  認証チェックを行わないパス情報リストを取得キー。
         */
        private static final String AUTHENTICATED_NOCHECK_PATH_PREFIX
                                     = "access.control.authenticated.escape.";
    
        /**
         *  認証チェックを行わないパス情報リストを取得キー。
         */
        private List<String> noCheckList = null;
    
        /**
         * リクエストのパス情報に対して、指定されたHTTPセッションが
         * 認証済みであるかどうかを判定する。
         *
         * @param pathInfo パス情報
         * @param req HTTPリクエスト
         * 
         * @return 認証に成功すれば <code>true</code>
         */
        public boolean isAuthenticated(String pathInfo, ServletRequest req) {
    
            if (log.isDebugEnabled()) {
                log.debug("call isAuthenticated");
            }
    
            //セッションからUVOを取得する。
            HttpSession session = ((HttpServletRequest) req).getSession();
            TutorialUVO uvo = (TutorialUVO) session.getAttribute("USER_VALUE_OBJECT");
    
            //UVO、またはUVOに登録されているIDがnullの場合はfalseを返却する。
            if (uvo != null && uvo.getUserId() != null) {
                return true;
            }
            return false;
        }
    
        /**
         * パスがチェック対象か否か判定する。
         * 
         * @param req 判定対象となる <code>ServletRequest</code> インスタンス
         * 
         * @return チェック対象の場合は<code>true</code>
         */
        public boolean isCheckRequired(ServletRequest req) {
    
            if (log.isDebugEnabled()) {
                log.debug("call isCheckRequired()");
            }
    
            //パス情報を取得する。
            String pathInfo = RequestUtil.getPathInfo(req);
    
            if (noCheckList == null) {
                noCheckList = new ArrayList<String>();
                for (int i = 1; ; i++) {
                    String path = PropertyUtil.getProperty(
                            AUTHENTICATED_NOCHECK_PATH_PREFIX + i);
                    if (path == null) {
                        break;
                    }
                    noCheckList.add(path);
                }
            }
            for (String path : noCheckList) {
                if (pathInfo.startsWith(path) || "/".equals(pathInfo)) {
                    return false;
                }
            }
    
            return true;
        }
    
    }
    
    

ログオン済みチェックを行うアクセスコントローラクラスは、Server(Web)版が提供するAuthenticationControllerを実装する。以下に実装するメソッドを示す。

メソッド名説明
isAuthenticatedログオン済みチェックを実装する。ログオン済みの場合はtrueを返却する。
isCheckRequiredチェックを実施するリクエストパスを判定する。チェック対象のリクエストであればtrueを返却する。

チュートリアルアプリケーションでは、セッションにUVOが登録されていればログオン済みとしている。

(3) アプリケーション共通のSpring設定ファイルの編集

作成したアクセスコントロールクラスを設定する。

  1. “terasoluna-spring-thin-blank\webapps\WEB-INF\applicationContext.xml”を開き、以下の箇所にアクセスコントローラクラスを設定する。
    ・・・略・・・
    
    <!-- ======================================== 各種フィルタコントローラ定義 -->
      <!-- ログオン済みチェック設定 -->
      <bean id="tutorialAuthenticationController"
            class="jp.terasoluna.thin.tutorial.web.common.controller.TutorialAuthController"/>
    
    ・・・略・・・
    
    

次項:2.12.2 アクセスフィルタの設定

Copyright (C) 2009 NTT DATA CORPORATION