java ee でユーザー認証をderbyを使って行ってみる

この前書いた記事ではglassfishにあるfile realmを利用してのログインを検証しました。fileベースなのでユーザーが増えた時や、利用者がパスワードを変更したい時などは何かと運用が難しいと思いました。

そこでjava ee でDerbyを利用したユーザー認証の例があるか検索したところ簡単に見つかりました。

たかがレルムされどレルム GlassFish で始める詳細 JDBC レルム | 寺田 佳央 – Yoshio Terada

またgithubなどでコードもあるので利用しました。

結果から言うと無事に動きました。以前、「エンタープライズシングルサインオン USO」の動作を説明するために動画を作ったのですが、その際にはJSP + Derbyで認証システムを構築しました。

デモ用なのでパスワードの暗号化などは行っていませんが、データベースと接続するための仕組みや、パスワードの変更などはDerbyと接続してSQL文で命令を作りました。

その時と比較するとJSFとかmavenとかの機能を利用したことは殆どなかったのですが結構簡単にできるのかなと思いました。

このチュートリアルで迷ったところ

とりあえずチュートリアルを作った時期にはNetbeans 8ではなかったので動作環境が違うからなのかちょっと変更した部分がありました。

うえの動画の認証の仕組みはとりあえずSQL文を直接実行する形になっているのでサーバー側の設定は必要がありませんでしたが、こちらのチュートリアルのP.29ではデータベースとの接続には接続「jdbc/__default」をしていたのですが私の環境ではなぜかうまくいかなかったのでデーターソースを作りなおしました。

20140521-s01

チュートリアル通りにしようと思うと上の画面が出てくました。そこでNetbeans データ・ソースを指定するとき「新しいデータ・ソース」を選択することで解消しました。

20140521-s02

ここから実際のデータ・ソースを選択してください。20140521-s03

ここで設定した内容についてはGlassFishの管理コンソールで簡単に確認できるかと思います。Web管理コンソールはNetbeansから起動できるのですがhttp://localhost:4848/にアクセスすれば利用できます。

そこで、左側のメニューから リソース→JDBCリソース、JDBC接続プールで確認できます。

なぜ上のようなエラーが表示されたのかはわかりませんが、今度またしらべて見たいと思います。

もう一つはp.94あたりで権限がないユーザーがアクセスした時に通常であれば403エラーが表示されるのですが、それは利用者にとってわからないのでそのエラーページ用のページを作成しています。

私が試してみたところ、このページが表示された時でも権限のないユーザーとしてはログインしているのでログインページに戻ってもこのページにアクセスすることになります。

そこで、このページが表示された時にログオフすることが必要だと思いました。

error-403.xhtmlに「<h:commandButton value=”ログアウト” action=”#{indexPage.logout()}”/>」を追加し、ログオフボタンを表示させました。

この場合、ボタンを押したらログオフができるのですが、ページが見つからないとエラーが出たので「IndexPage.java」のlogout()関数を調べると、「return “index.xhtml?faces-redirect=true”;」とありましたが、error-403.xhtmlがあるディレクトリーにindex.xhtmlがないのでエラーになるはずです。そこで「return “/faces/login/index.xhtml?faces-redirect=true”;」 としたところ期待した動きになりました。

チュートリアルでわかったこと

JSPとサーブレットだけでゴリゴリ書けば同じことができるのはわかっていたのですが、これほど高度なことをつくろうと思うと結構な手間がかかるような気がします。

ログインのパスワードもパスワードを生で入れているわけではなくハッシュで対応し、パスワードの検証ができるのは結構驚きました。

このチュートリアルでJSFやmavenなどに触れてみましたが、やはりいろいろなことをするのであればこのような技術について勉強したほうがいいなと思った次第です。

このチュートリアルでは認証だけでなくデーターベースへの追加の方法なども書いてあるのでコードを見てみて勉強してみたいと思いました。

 

コメントを残す