SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaで軽快に使える「軽量フレームワーク」特集

Javaで軽快に使える「軽量フレームワーク」特集
~Apache Wicketで簡単Webアプリ作成(3)

第3回


  • X ポスト
  • このエントリーをはてなブックマークに追加

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
  •  初期化のためのinitでは、まずsuper.init();でスーパークラスのinitを呼び出します。これにより、AuthenticatedWebAppクラスで必要となる各種の初期化が行われます。これを忘れると認証がうまく機能しないので注意してください。その後、エンコーディング設定の処理を用意しておきます。

  • getSignInPageClass
  •  これは、ログインページとなるクラスを返すメソッドです。ここではSignInPageというクラスとして用意する予定なので、このクラスを返すようにしておきます。

  • getWebSessionClass
  •  これは、Webセッションクラスを返すメソッドです。ここでは、AuthAppSessionというクラスとして用意する予定なので、このクラスを返すようにします。

  • onUnauthorizedPage
  •  認証に失敗した場合の処理を用意するためのメソッドです。ここでは「RestartResponseAtInterceptPageException」という例外クラスを作成しthrowしています。これによりリクエストを中断し、強制的に別のページ(ここでは引数に指定したErrorPage.classのWebPage)にジャンプします。

 getHomePagegetConfigurationTypeについては、既に説明しましたので省略します。新たに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つの重要な働きが用意されます。認証処理の中心部分といってよいでしょう。

次のページ
web.xmlとスタイルシートの用意

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Javaで軽快に使える「軽量フレームワーク」特集連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4461 2009/12/22 09:15

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング