目次 > 第2章 Server(Web)版チュートリアル > 2.12 アクセス制御 > 2.12.1 アクセスコントローラクラスの作成と設定
2.12.1 アクセスコントローラクラスの作成と設定
Server(Web)版が提供するアクセス制御機能は、リクエストごとの前処理にてアクセスを制御する。アクセス制御の流れを以下に示す。
■ アクセス制御の流れ
- ブラウザからのリクエストをアクセスフィルタが受け取る。
- アクセスフィルタは、アクセスコントローラを呼び出す。
- アクセスコントローラでリクエストに対するアクセスチェックを実施し、結果をアクセスフィルタに返却する。
- 返却された結果により、アクセスフィルタで処理を振り分ける。
Server(Web)版では、以下のアクセスフィルタクラスとアクセスコントローラのインタフェースを提供している。
機能 | アクセスフィルタクラス | アクセスコントローラインタフェース |
ログオン済みチェック | AuthenticationControlFilter | AuthenticationController |
アクセス権限チェック | AuthorizationControlFilter | AuthorizationController |
業務閉塞チェック | BlockageControlFilter | BlockageController |
サーバ閉塞チェック | ServerBlockageFilter | ServerBlockageController |
拡張子直接指定禁止 | ExtensionFilter | なし(フィルタクラス単体で動作する) |
本項では、ログオン済みチェックのアクセスコントローラクラスの作成と設定手順について説明する。
手順
本項では以下の作業が必要になる。
(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) アクセスコントローラクラスの作成
チェック処理を実装するアクションコントローラクラスを作成する。
- “terasoluna-spring-thin-blank\sources”を右クリックする。
- 「新規」→「クラス」を選択する。
- 以下の通り入力し、「終了」ボタンを押下する。
- パッケージ:jp.terasoluna.thin.tutorial.web.common.controller
- 名前:TutorialAuthController
- インターフェース:jp.terasoluna.fw.web.thin.AuthenticationController
- 生成された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設定ファイルの編集
作成したアクセスコントロールクラスを設定する。
- “terasoluna-spring-thin-blank\webapps\WEB-INF\applicationContext.xml”を開き、以下の箇所にアクセスコントローラクラスを設定する。
・・・略・・・ <!-- ======================================== 各種フィルタコントローラ定義 --> <!-- ログオン済みチェック設定 --> <bean id="tutorialAuthenticationController" class="jp.terasoluna.thin.tutorial.web.common.controller.TutorialAuthController"/> ・・・略・・・