プログラミング日記スマートフォン用の表示で見るひたすらプログラミング日記この広告は、90日以上更新していないブログに表示しています。JavaWicketの認証機能に関して便利なクラス等が提供されている「wicket-auth-roles」。自分の今までの知識を整理するためにもエントリーを書いていこうかなと思います。Wicketの認証機能に関して今までいろいろ参考にさせてもらったサイト、ブログ。勝手ながら一方的お礼を言わせてもらいますw。他にはすでに認証用のIAuthorizationStrategyがあったり、そのクラス等をすでに設定済みのWebApplicationクラスがあったり。このライブラリを使いこなせば認証処理は格段に楽になると思います。NextPageへのリンクがある。ログインフォームがある。アクセス使用としたページに対する権限をユーザーが持っていない場合に表示されるページ)他にSpringを使用してDIされたサービスクラスを使用してSignInの処理を実行するって感じにします。前置きが長くなってしまいましたが、wicket-auth-rolesを使ったクラスがどういう感じになるか。説明は後回しにして、作成するクラスを全部列挙してみます。wicketのバージョンは1.4RC2です。}}MyApplication.javaまず、基本のWebApplicationのサブクラス。web.xmlのfilterに登録するクラスですね。これはwicket-auth-rolesが提供するAuthenticatedWebApplicationクラスのサブクラスとして作成します。実装するメソッドは4つ。getHomePagegetHomePageでは最初に表示させるページのClassオブジェクトを返します。ここはいつも通りですね。initinitメソッドでは最初に必ずスーパークラスのinitメソッドを呼び出します。SpringComponentInjector(this))と記述します。Springを使用する際の呪文みたいなもんですねwgetSignInPageClass(AuthenticatedWebApplicationでは抽象メソッド)名前の通りここではSignIn(ログイン)のページクラスのClassオブジェクトを返します。未ログインの状態で、且つアノテーション等による権限の設定がされているページに対してアクセスされた場合にここで指定されたページが表示されます。getWebSessionClass(AuthenticatedWebApplicationでは抽象メソッド)ここには後述する認証機能を実装したAuthenticatedWebSessionのサブクラスのClassオブジェクトを返します。onUnauthorizedPageアクセスしようとしたページに対してユーザーの権限が不足していた場合にこのメソッドが呼ばれます。引数にはアクセスしようとしたPageクラスのオブジェクトが渡されてきます。今回は「権限ないよ〜」と書かれたページを表示するためRestartResponseAtInterceptPageExceptionをthrowしています。ちなみにオーバーライドするだけしてRestartResponseAtInterceptPageExceptionをthrowしなかった場合は何事もなかったかのように権限不足のページが表示されてしまうので気をつけましょうwMySession.java認証ロジックを実装したSessionクラスです。通常であればWebSessionを継承し、アプリケーションに合ったサブクラスを作成するかと思いますが、wicket-auth-rolesを使用する場合はAuthenticatedWebSessionクラスを継承し、独自のSessionクラスを作成します。コンストラクタ重要なのはInjectorHolder.getInjector().inject(this)です。通常Spring等のDIコンテナを使用する場合、Wicketのコンポーネントに対してはDI用のアノテーション(Springの場合は@SpringBean)を付けていれば勝手にInjectしてくれますが、コンポーネントではないSessionのサブクラスにおいては@SpringBeanを使用するだけではDIコンテナにて管理されているオブジェクトをInjectしてくれません。いう場合はInjectorHolder.getInjector().inject(this)を記述することでインスタンス生成時にDIコンテナで管理されているオブジェクトをInjectしてくれるようになります。追記:4/20Guiceを使用する場合はInjectorHolder.getInjector().inject(this)だけではInjectしてくれないようです。こちらにてGuiceを使用した場合のSessionオブジェクトに対するInjectの方法に関するエントリーが書かれています。いうことはSeaserを使用した場合も違うのかな??authenticate(AuthenticatedWebSessionでは抽象メソッド)このメソッド内にてInjectされたServiceクラスやDaoクラスを使用し、認証ロジックを実行させます。trueもしくはfalseを返してもいいのですが、trueだった場合は適切なRole情報を設定しないといけません。後述するgetRolesメソッドはページ表示の際に毎回呼び出されるので、この時点で適切なRole情報を設定しておくの良いかなと。*1今回はとりあえず固定でADMINとUSERの両方の権限を持つRolesオブジェクトを返すようにしています。実際のアプリケーションではここからさらにDBにアクセスしたりして動的にRolesオブジェクトを生成するようになるかと思います。getRoles(AuthenticatedWebSessionでは抽象メソッド)これはそのまんまですねwgetこれもそのまんまですね、Pageクラス等で使用する際にダウンキャストを不要にするためのシンタックスシュガー的メソッドです。TopPage.javaADMINとUSERの権限のどちらかをユーザーが持っていればこのページは表示可能です。初回アクセス時は未ログインの状態なのでこのページを表示させようとしてもログインページ(SignInPage)に自動的に飛ばされます。NextPage.javaADMIN権限のみ表示可能なページです。MySession#authenticate内でRolesオブジェクトを生成する際にADMINを付加しないようにしてからログイン後にこのページにアクセスした場合はこのページは表示できず、MyApplication#onUnauthorizedPageにて設定しているUnAuthorizedPageへ遷移します。SignInPage.javaコンポーネントの使い方とかは省略するとして、要点は下記の部分になります。}AbstractFormValidator#validateメソッド内にてMySessionクラスを取得し、signInメソッドを呼び出すことで認証処理を実行しています。ちなみにこのsignInメソッドはMySessionクラスの親クラスであるAuthenticatedWebSessionクラスにて定義されていて、このメソッドの中でauthenticateメソッドが呼ばれています(TemplateMethodパターンですね)。}continueToOriginalDestinationメソッドを呼ぶと元々アクセスしようとしていたページが表示されます。未ログインの状態でTopPageにアクセス使用とした場合、未ログインなのでSignInPageが表示されますが、このcontinueToOriginalDestinationを呼んでおくと勝手に次のページにはTopPageが表示されます。if文を使っているのは直接このページにアクセスしてきた場合はcontinueToOriginalDestinationを呼び出してもページ遷移はせずにfalseが帰ってくるので、デフォルトの動作としてTopPageを表示させるために上記のような記述をしています。基本的なwicket-auth-rolesの使い方はこんな感じでしょうか。実際の構築するアプリケーションを意識して書いてみました。次回以降はカスタマイズ方法とか応用編って感じでエントリーを書いてみようと思います。何か間違って所とかあったらご指摘いただけると嬉しいです。*1:ログイン中にもユーザーの権限情報が変更される可能性のあるアプリケーションであれば別ですが。月別アーカイブはてなブログをはじめよう!hayasshさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。