ログインページの変更
以上のように、wicket-auth-rolesを使うと、ほとんどの機能が自動生成されてすぐに使えるようになります。しかし、こうしたできあいのものでなく、独自に実装をしたいと思うこともあるでしょう。こうしたときには、独自に定義した機能を追加して利用することもできます。
例として、ログインページを独自定義のWebページに変更してみましょう。先ほど作成した「SignInPage.html」と「SignInPage.java」を書き換えてみることにします。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=utf-8">
<title>Sign in</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<h1>Sign in Page.</h1>
<p>※ユーザー名とパスワードを入力してください。</p>
<div wicket:id="error"></div>
<table>
<form wicket:id="form">
<tr><td>USER:</td></tr>
<tr><td><input type="text" wicket:id="username"></td></tr>
<tr><td>PASSWORD:</td></tr>
<tr><td><input type="password" wicket:id="password"></td></tr>
<tr><td></td></tr>
<tr><td><input type="submit" wicket:id="submit1"></td></tr>
</form>
</table>
</body>
</html>
ここでは、"username"と"password"という2つの入力フィールドと送信ボタンを用意しています。違いが分かるよう、若干レイアウトを変えておきました。WebPageクラスは、通常のWebPageを継承して作成します。
package jp.tuyano;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.*;
import org.apache.wicket.util.value.ValueMap;
public class AuthSignInPage extends WebPage {
private CompoundPropertyModel<WebPage> formModel;
private TextField<String> username;
private PasswordTextField password;
private final ValueMap properties;
public AuthSignInPage(){
properties = new ValueMap();
this.add(new FeedbackPanel("error"));
formModel = new CompoundPropertyModel<WebPage>(this);
Form<WebPage> form1 = new Form<WebPage>("form",formModel);
username = new TextField<String>("username",
new PropertyModel<String>(properties,"username"));
form1.add(username);
password = new PasswordTextField("password",
new PropertyModel<String>(properties,"password"));
form1.add(password);
Button submit = new Button("submit1"){
private static final long serialVersionUID = 1L;
@Override
public void onSubmit() {
submitNow();
}};
form1.add(submit);
this.add(form1);
}
public void submitNow(){
AuthApp app = (AuthApp)this.getApplication();
AuthAppSession session = (AuthAppSession)this.getSession();
boolean flg = session.authenticate(this.getUsername(), this.getPassword());
if (flg)
this.setResponsePage(app.getHomePage());
else
app.onUnauthorizedPage(this);
}
public String getUsername(){
return username.getDefaultModelObjectAsString();
}
public String getPassword(){
return password.getInput();
}
}
入力フィールドのコンポーネントには、値を保管するものとしてModelではなく「PropertyModel」というものを設定しています。これは「ValueMap」というLinkedHashMapのサブクラスを使ってプロパティを管理するモデルです。また、"username"、"password"の値を返す「getUsername」「getPassword」といったメソッドも用意しています。これは、AuthenticatedWebApplicationクラスでgetSignInPageClassとして指定するクラスで必要となります。
実際のログイン処理は、submitNowメソッドで行っています。これは、AuthAppSessionクラスのauthenticateを呼び出してログインチェックを行い、その結果に応じてホームページに移動するか、アプリケーションクラスのonUnauthorizedPageを呼び出すかを設定しています。
なお、ここではログインするかどうかをチェックするだけで、実際にログインするための処理は用意していません。ログインするには、authenticateした後、AuthenticatedWebSessionクラスの「signIn」メソッドを呼び出してください。またログインしているかどうかのチェックは、同クラスの「isSignedIn」メソッドを呼び出して調べることができます。

まとめ
wicket-auth-rolesによる認証についてひととおり説明を行いました。wicket-auth-rolesを導入することで、面倒な認証やページごとのアクセス制御が非常に簡単に実装できることが分かるでしょう。特に、アノテーションを使ったページごとのアクセス制御は、非常にシンプルで使いやすいものがあります。設定などを書くことなく、また制御のための具体的なコードを書く必要もなく、Javaらしいスタイルですっきりとアクセス制御を組み込めるからです。
以上、3回に渡って、WicketによるWebアプリケーション開発について解説をしましたが、いかがだったでしょうか。Wicketの提唱する「コンポーネント指向のWebアプリケーション開発」がどのようなものか、だいぶイメージがつかめたのではないかと思います。Wicketの考え方は、Strutsなどに代表される従来のMVCフレームワークとはかなり違います。これを「非常に面白いスタイルだ」と思うか、「あまりに違っていて分かりにくい」と感じるか、それによってWicketの評価は大きく変わってくるでしょう。自分に向いたスタイルかどうか、まずは一度使ってみてください。
