AuthAppアプリケーションクラス
では、まずアプリケーションクラスから作成しましょう。「AuthApp.java」というファイルを用意し、次のようにソースコードを記述します。
package jp.tuyano; import org.apache.wicket.Page; import org.apache.wicket.RestartResponseAtInterceptPageException; import org.apache.wicket.authentication.*; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.protocol.http.WebApplication; public class AuthApp extends AuthenticatedWebApplication { @Override protected void init() { super.init(); this.getRequestCycleSettings().setResponseRequestEncoding("UTF-8"); this.getMarkupSettings().setDefaultMarkupEncoding("UTF-8"); } @Override protected Class<? extends WebPage> getSignInPageClass() { return AuthSignInPage.class; } @Override protected Class<? extends AuthenticatedWebSession> getWebSessionClass() { return AuthAppSession.class; } @Override protected void onUnauthorizedPage(Page page) { throw new RestartResponseAtInterceptPageException(ErrorPage.class); } @Override public Class<? extends Page> getHomePage() { return IndexPage.class; } @Override public String getConfigurationType() { return WebApplication.DEPLOYMENT; } }
認証を利用するアプリケーションクラスは、org.apache.wicket.authenticationパッケージに用意されているAuthenticatedWebApplicationクラスを継承します。このクラスには、アプリケーションとして用意するメソッド類の他に、認証に関連するメソッドが用意されています。これらをオーバーライドすることで必要な機能を実装します。ここで用意されているメソッド類についてひととおり説明しましょう。
init
getSignInPageClass
getWebSessionClass
onUnauthorizedPage
初期化のためのinit
では、まずsuper.init();でスーパークラスのinit
を呼び出します。これにより、AuthenticatedWebAppクラスで必要となる各種の初期化が行われます。これを忘れると認証がうまく機能しないので注意してください。その後、エンコーディング設定の処理を用意しておきます。
これは、ログインページとなるクラスを返すメソッドです。ここではSignInPageというクラスとして用意する予定なので、このクラスを返すようにしておきます。
これは、Webセッションクラスを返すメソッドです。ここでは、AuthAppSessionというクラスとして用意する予定なので、このクラスを返すようにします。
認証に失敗した場合の処理を用意するためのメソッドです。ここでは「RestartResponseAtInterceptPageException」という例外クラスを作成しthrow
しています。これによりリクエストを中断し、強制的に別のページ(ここでは引数に指定したErrorPage.classのWebPage)にジャンプします。
getHomePage
/getConfigurationType
については、既に説明しましたので省略します。新たに3つのメソッドが用意され、そこでログインページ、セッションクラス、例外処理といったものが用意されています。これらのメソッドを元に認証が機能するようになっているのです。
AuthAppSessionセッションクラス
続いて、セッションクラスを作成します。ここでは「AuthAppSession.java」というファイルを用意し、次のようにソースコードを記述しましょう。
package jp.tuyano; import java.util.HashMap; import org.apache.wicket.Request; import org.apache.wicket.authentication.AuthenticatedWebSession; import org.apache.wicket.authorization.strategies.role.Roles; import org.apache.wicket.model.Model; public class AuthAppSession extends AuthenticatedWebSession { private static final long serialVersionUID = 1L; private Roles roles; private HashMap<String,String> map; public AuthAppSession(Request request) { super(request); map = new HashMap<String,String>(); map.put(Roles.ADMIN, "admin"); map.put(Roles.USER, "user"); } @Override public boolean authenticate(String user, String pass) { if (map.get(user) != null && map.get(user).equals(pass)){ roles = new Roles(user); return true; } else { roles = null; return false; } } @Override public Roles getRoles() { return roles; } }
AuthenticatedWebSession継承クラスでは、コンストラクタの他に、認証の処理を行う「authenticate
」メソッド、そしてRolesインスタンスを返す「getRoles
」メソッドが用意されています。
まずはコンストラクタから見てください。ここではスーパークラスのコンストラクタを呼び出した後、「HashMap」クラスのインスタンスを作成しています。これは、ユーザー名とパスワードのデータを保管しておくものです。認証のためのユーザー名とパスワードの情報の管理法はいろいろと考えられますが、今回は管理者と一般ユーザーの2つだけなので、HashMapでまとめておきました。
作成したHashMapには、put
を使い、「Roles.ADMIN」「Roles.USER」といったユーザー名を追加しています。Rolesというクラスは、ユーザーと権限を示す情報を管理するもので、管理者と一般ユーザーのユーザー名があらかじめクラスフィールドとして用意されています。それがこのADMINとUSERです。これらは、実はただの"ADMIN"
、"USER"
というString
値です。ここでは、ADMINには"admin"
、USERには"user"
というパスワードを設定してあります。
続いて、authenticate
メソッドです。ここで、認証の作業をしています。このメソッドはString
の引数が2つあり、それぞれユーザー名とパスワードが渡されます。これらの値をチェックし、認証するか否かを判断しboolean
で値を返します。ここでは、先ほど用意したHashMapから引数で渡されたユーザー名の値があるかどうかチェックし、あったらパスワードの値が正しいかどうかをチェックして認証すべきかどうかを判断しています。この際、認証する場合には引数のユーザー名のRolesを、認証しない場合にはnullをそれぞれprivate
フィールドに保管しています。この「認証の状況に応じてRolesを用意する」は重要です。次のgetRoles
で、ここで用意したRolesが利用されるためです。
最後のgetRoles
メソッドは、Rolesインスタンスを返すものです。これは、private
フィールドに保管してあるRolesをそのまま返すだけです。返されるRolesによって、認証されているかどうか、あるいは特定のページへのアクセスを許可するか否かを判断するようになっています。
このように、セッションクラスでは「認証するかどうかの判断」と「現在ログインしているユーザーに関するRolesの作成」という2つの重要な働きが用意されます。認証処理の中心部分といってよいでしょう。