- - PR -
サーブレットの認証について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-08-27 01:46
サーブレットを使って認証を行うとき、
みなさんはどのような方法で行っていますか? 主にサーブレットコンテナの認証の仕組みを使うケースと、 ウェブアプリで自前で認証を行うケースがあると思います。 前者はHttpServletRequest#getUserPrincipal()などのメソッドが使えますが、 後者はHttpSession#getAttribute()などで認証チェックを行うかと思います。 自分の場合は自前認証を行ってから、セッションにPrincipalを実装したオブジェクトを格納し、 サーブレットフィルタ内で独自のHttpServletRequestを作成して差し替えています。 独自のHttpServletRequestはユーザ関連のメソッドをオーバーライドして、 セッションに格納したPrincipalを返すようなつくりにしています。 なぜ自前の方法にするかというと、ユーザ情報をDBに持つのと、 フレームワークと連動させたいというのが理由です。 一般的に使われる方法はどのような方法なんでしょうか? |
|
投稿日時: 2008-08-27 09:29
こんにちは。
私も大体同じ方法でこれが最も簡易で一般的かなと思ってます。 1.ログイン処理時(画面でsessionクリア + logout時 + timeout時) 2.ログイン認証時にDB認証からHttpSession#setAttribute() 3.他アプリ内のActionの共通処理として、HttpSession#getAttribute()でユーザチェック フレームワークを使う場合は特にこういう継承元クラスに共通処理を記述するのが一般的じゃないでしょうか?どなんでしょうか? |
|
投稿日時: 2008-08-27 11:14
自前で組む場合は JAAS の API を叩くのが一般的ではないでしょうか?
既に用意されている DB、LDAP、ファイルベース等の認証の仕組みを再利用できるからです。 |
|
投稿日時: 2008-08-27 11:46
意見ありがとうございます。
JAASは気にはなっていたのですが、まだ試したことがないですね。 WARでの配布の容易性と、フレームワークとの連携が少々気になります。 やはりサーブレットコンテナと密結合になってしまうのでしょうか。 |
|
投稿日時: 2008-08-27 12:05
私は普段はまずはJAASありきで作っていますが、
1. <login-config>がServletContextに対して一つしか持てない 2. <auth-method>のバリエーションが少ない 3. <auth-method>のカスタマイズが標準ではできない といった制約が厳しいため、シングルサインオン的な要件がある場合は かつのりさんの書かれたものと同じFilterでの実装を自前で作ったり、 Tomcatの場合ではAuthenticatorを作ってしまうこともあります。 LoginModuleの自前実装(or 既存のものを拡張)も行うことはありますが、 それよりも認証方法そのものをカスタマイズしたいことの方が多いです。 どんな場合でも、アプリケーションとしてはweb.xmlの変更以外は 行わずにどちらでも動作するように作るように心がけています。 |
|
投稿日時: 2008-08-27 13:45
多分、あまりよくない一般的でない方法ですが、スマートカードのクライアント認証とDBに格納したユーザ/パスワードdigest値のBasic認証で同様にログインできるようにするために、2つWebアプリから1つのejbを呼び出してログインを管理するシステムを作ったことがあります。
一方でログインを行うと、すぐに他方の画面に遷移して同じユーザでログインしなおせば、一定時間内に1度だけ行った場合は認証ユーザと判断してログイン状態にしていました。 問題がありそうな気もするので、指摘していただくととてもありがたい。 |
|
投稿日時: 2008-08-27 15:59
>あしゅさん
JAASで唯一いやな感じだったのは、 confファイルだったのですが、改めてAPIを見ると、 Configuration#setConfiguration(Configuration)で、 自前の設定を追加してやるようにすれば、 confファイルを用意する必要もなく使えるのですね。 ただ、コンテナに対しての最低限の設定は必要になるのでしょうね。 >だっちょさん 私もシングルサインオンのような仕組みを自前で実装したことがありますが、 やはりコンテナへの非依存の場合、融通が利きますね。 今の画面にオーバーレイでログインダイアログを表示して、 AjaxでID/PWを送信する仕組みと、シングルサインオンと、 非ログイン→ゆるいログイン→強いログインという状態管理の仕組みだったんですが、 自前認証の方じゃないと実装できないものなのでしょうか。 なぜ、コンテナ依存、非依存にそんなに拘っているのかと言うと、 開発はTomcatで、実機はエンタープライズサーバというような場合も想定すると、 コンテナ依存する仕組みを最初から採用しない方がいいではという思い込みです。 |
1