管理者のみが見られる画面を作るには
メインページ>コンピュータの部屋#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 の別の設定を適用することが可能になります。