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