仕事柄「AccessMatrix USO」を扱っているのでユーザー認証の仕組みの作り方は知っているのですが、GlassFishでJava eeで比較的簡単にユーザー認証の仕組みが作れるようなので試してみました。
とりあえず認証ができたらということで「Securing a Web Application in NetBeans IDE」を参考にしてみました。
環境は、Netbeans 8.0/ GlassFish 4/ JDK 1.8.5で行いました。
上に上げた例ですが、Tomcat, GlassFish, WebLogicでやっていますが、JSP/HTMLは全く同じで、web.xmlなどの設定ファイルの書き方が若干異なるようです。
とりあえずGlassFishの方でユーザー登録をします。Tomcatの例で上げた、roleではなくグループがあるので図のようにID:admin/GP:admin、ID:user/GP:userのように割り当てました。
サイト側の設定はweb.xmlの設定で行います。
認証方式はいくつかの方式が選べますが、アプリケーションでひとつの方式しか選べないようです。基本認証とフォーム認証を選べますが、基本認証ではその仕組からユーザーを切り替えるにはブラウザーを一旦閉じないと行けないので検証するのであればフォーム認証がいいと思います。
ここでは
- ログインフォーム
- ログイン失敗画面
- 権限(ロール)
- ロールごとにアクセスできるディレクトリの指定
が行えるようになっています。
ただしGlassFishのレルムではロールの指定ではなくグループの指定なのでロールに対してグループをマッピングできます。
glassfish-web.xmlファイルでロールとグループのマッピングができます。
ここでlogin.jspにアクセスするとログイン画面が表示されます。
認証が成功すると、管理画面かユーザー画面かのリンクが出てきます。
adminでログインをしたのでアドミン画面は表示されます。
しかしユーザー画面にアクセスすると403が表示されます。
ユーザーでログインするとユーザー画面は無事に表示されました。
PHPでも、Javaでもゴリゴリ書けば同様のことはできますが、深く考えなくてもここまで簡単にできるのは素晴らしいと思いました。
課題
たしかに簡単に認証はできるようになりましたが具体的なアプリケーションを考えると改善点があります。
- ログアウトを任意にさせたい。
- ユーザーロールごとにアクセスさせたくないリンクは表示させない
- ユーザー認証情報をLDAP/ DBに持たせたい。
またこの辺りについては明日以降検証していきたいと思います。
思いがけず簡単に出来てびっくりしました。