管理者のみが見られる画面を作るには

提供: tknotebook
2017年1月17日 (火) 06:57時点におけるNakamuri (トーク | 投稿記録)による版

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

メインページ>コンピュータの部屋#Java>Struts2 Tips


よくある話ですが、管理者でログインした人のみ、管理者用の画面を表示できるように したい時がよくあります。

サイトのメインメニューで、管理者用の画面へのリンクボタンを削ってしまえば 管理者用の画面へは簡単にはいけなくなりますが、管理者用の画面をブックマークしておいて 画面へ直接ジャンプすることも考えられます。

このような場合、管理者でログイン済みかをチェックするインターセプターを作って、 管理者用の画面ではそのインターセプターを使うのが定石です。

管理者チェックインターセプター

利用者が管理者でログインしているかチェックするインターセプターは例えば こんな感じになります。

利用者が管理者でログインしている場合、セッションの admin アイテムに Boolean で true が代入されているとすると

package info.nakamuri.app.pub.flashcard.interceptors;

import java.util.Map;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

/**
 * 管理者確認インターセプター.
 */
public class AdminInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		Map<String, Object> session = invocation.getInvocationContext().getSession();

		Boolean admin = (Boolean) session.get("admin");

		if (admin == null) {
			// admin権限のセッション情報がなければエラー
			return "authorityError";
		} else if (!admin) {
			// admin権限が trueでなければエラー
			return "authorityError";
		} else {
			// 権限ありでログイン中なら何もしない。
			return invocation.invoke();
		}
	}

}


struts.xmlの共通設定

このインターセプターの使用と権限エラー時の画面遷移を表す struts.xml の package の設定は

	<package name="admin" extends="struts-default">
                <!-- 権限チェックインターセプターの設置 -->
		<interceptors>
			<interceptor name="adminInterceptor"
				class="info.nakamuri.app.pub.flashcard.interceptors.AdminInterceptor" />
			<interceptor-stack name="adminStack">
				<interceptor-ref name="adminInterceptor" />
				<interceptor-ref name="loginStack" />
			</interceptor-stack>
		</interceptors>
		<default-interceptor-ref name="adminStack" />

		<global-results>
		        <!-- 権限不足なら権限エラー画面へ -->
			<result name="authorityError">/WEB-INF/content/common/authorityError.jsp
			</result>
		</global-results>
	</package>

各画面の設定

struts.xml の中に各管理者画面用のアクションの設定(package) を書くなら、 上記の package admin を継承した package にするだけです。

Conventionプラグイン を使って、画面のアクションの設定にアノテーションを使う場合は、各アクションクラスの先頭に

@ParentPackage("admin")

などと書くのもいいでしょう。

各管理者画面用のアクションが多数ある場合は、管理者用画面のアクションクラス群を Java のある特定の package に納め、 そのpackage の package-info.java の中に

@ParentPackage("admin")
package info.nakamuri.app.pub.flashcard.actions.admin;

import org.apache.struts2.convention.annotation.ParentPackage;

などと書き込んでおくのが楽です。こうするとその java package に含まれる全てのアクションクラスと、その java package の 全てのサブパッケージに含まれるアクションクラスに admin package(strutsの設定の package)の設定が適用されます。

このやり方なら画面を、未ログインで見られる画面、ログイン済みでないとみられない画面、ログイン済みでかつ管理者でないと 見られない画面などにグループ分けし、グループ毎に struts.xml の別の設定を適用することが可能になります。