「管理者のみが見られる画面を作るには」の版間の差分
(ページの作成:「Category:コンピュータCategory:JavaCategory:Struts2 メインページ>コンピュータの部屋#Java>Struts2 Tips よくある話...」) |
|||
12行: | 12行: | ||
このような場合、管理者でログイン済みかをチェックするインターセプターを作って、 | このような場合、管理者でログイン済みかをチェックするインターセプターを作って、 | ||
管理者用の画面ではそのインターセプターを使うのが定石です。 | 管理者用の画面ではそのインターセプターを使うのが定石です。 | ||
+ | |||
+ | ==管理者チェックインターセプター== | ||
+ | |||
+ | 利用者が管理者でログインしているかチェックするインターセプターは例えば | ||
+ | こんな感じになります。 | ||
+ | |||
+ | 利用者が管理者でログインしている場合、セッションの admin アイテムに Boolean で true が代入されているとすると | ||
+ | |||
+ | <pre> | ||
+ | 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(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | |||
+ | ==struts.xmlの共通設定== | ||
+ | |||
+ | このインターセプターの使用と権限エラー時の画面遷移を表す struts.xml の package の設定は | ||
+ | |||
+ | <pre> | ||
+ | <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> | ||
+ | </pre> | ||
+ | |||
+ | ==各画面の設定== | ||
+ | |||
+ | 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 の別の設定を適用することが可能になります。 |
2017年1月17日 (火) 06:07時点における版
メインページ>コンピュータの部屋#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 の別の設定を適用することが可能になります。