- PR -

BASIC認証をクリアしたい

投稿者投稿内容
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-05-18 15:21
どもです。がると申します。
引用:

skulkerさんの書き込み (2005-05-18 14:27) より:
商用アプリケーションサーバだとログアウトの独自APIが提供されていたりしますが、Tomcatはどうだったか。
TomcatはHttpSessionを無効化すると認証情報も一緒に消えるような実装だったような。


んっと…。この書き込みを見る限りですと、もしかして"TomcatのBasic認証"
というのは、Apacheで言う所のBasic認証とは違う機構なのでしょうか?
サーブレット、Tomcat、Basic認証あたりでぐぐって見たのですが…見る限り
では、Apacheと変わらない実装のように見えたのですが。

「TomcatはHttpSessionを無効化すると認証情報も一緒に消えるような実装」
をApacheのBasic認証を基準に考えると
「何らかの手段でブラウザに"認証情報を消すように依頼するレスポンスヘッダ"
が必要になるのですが。ちと、今まで耳にしたことがなかったもので。

java周りはまだ知らないことも多々あるので、お話など伺えるとありがたいです。
田中
ベテラン
会議室デビュー日: 2002/05/08
投稿数: 54
投稿日時: 2005-05-18 16:02
質問者の田中です。
こんなわずかな時間に沢山の書き込みを頂きありがとうございます。

私が教えて欲しかったのは「どうやって認証されていない状態に戻すか」ということで、これに対してEdossonさんの最初の回答がヒントを下さいました。
なるほどセッションを破棄するという観点でいろんな本を読み直してみると「invalidate()メソッドでセッションオブジェクトを破棄せよ」とありました。
ここでいうセッションはHTTPではなくサーブレットが管理するセッションのことだと思います。
恐らくEdossonさんの最初の回答はこのことをおっしゃっていたのではないでしょうか?

で、早速やってみた(というより元々サンプルにコーディングされていた)のですが上手くいきません。
どう上手くいかないかというと、ログアウトをすると一旦ログアウトしたように見えるのですが、ログインボタンを押しただけでそのままログインできてしまいます。
IEだと上手くいかないようなことが書いてあったのでネスケでも試しましたが同様です。

がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-05-18 16:21
どもです。がるです。
引用:

私が教えて欲しかったのは「どうやって認証されていない状態に戻すか」ということで


んっと。もしTomcatのBasic認証がApacheのBasic認証と同じものであるとすると、
「どうやって」という質問への直接的な回答は「その手段は存在しない」です。
# 理由は私の前の書き込みを参照してください。

skulkerさんのおっしゃるような「ApacheのBasic認証とTomcatのBasic認証
は違うものである」が真なら、あるいは方法があるかとは思うのですが。

お力になれなくて申し訳ないです。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-05-18 16:56
引用:

田中さんの書き込み (2005-05-18 16:02) より:
私が教えて欲しかったのは「どうやって認証されていない状態に戻すか」ということで、これに対してEdossonさんの最初の回答がヒントを下さいました。


これまでの書き込みをよーく読んでいただければわかりますが、BASIC認証というのは、リクエ
ストごとに認証をおこなうため、ブラウザから認証情報が送られてきてしまえば、認証された
ものとしてレスポンスを返します。ログアウトという状態を作りだすためには、セッションが
存在するかどうかを確認し、存在しなければステータスコード401を送信することで擬似的に
実現することができるでしょう。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-05-18 17:03
こんにちは。
Java や Tomcat について申し上げることは無いのですが…
引用:
私が教えて欲しかったのは「どうやって認証されていない状態に戻すか」ということで、これに対してEdossonさんの最初の回答がヒントを下さいました。



これはもう、強引に 401応答を返すしか無いのでは。
ブラウザ側は、今まで覚えていた認証情報が無効になったことを悟り、改めて認証情報入力ダイアログを出すことになるでしょうけれど。

以上、ご参考まで。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-05-18 17:05
引用:
「invalidate()メソッドでセッションオブジェクトを破棄せよ」とありました。


で、それをすると、ブラウザにはどのようなレスポンスが返るのですか? もし、サーバー内部の状態が変化するだけであれば、ブラウザが自動的に Authorization ヘッダを送ってくるという動作を止めさせることはできませんよね?

引用:
ここでいうセッションはHTTPではなくサーブレットが管理するセッションのことだと思います。


それは分かっているんです。けど。どんなにすごいアプリケーションサーバーを使っても最終的には HTTP の範囲でブラウザにレスポンスを返さなくちゃいけない。それで、ブラウザに認証の再利用を止めさせるようなヒントヘッダはあるのかなあ、ということになるわけのだけど、おそらくない。もしかすると、Expires や Cache-Control でできるかもしれないけど、たぶん無理。そんな好意的な解釈をするブラウザはいないでしょう。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-05-18 17:10
私もHTTPのBASIC認証の動きはよく知らなかったのですが
皆さんの意見から強引に行うとすれば

・seevlet側でユーザログイン情報をsessionに保持しておく
 →ログイン時にsessionにset

・ログアウト、sessionタイムアウト時などでsessionからユーザログイン情報を破棄

・次ログイン時はsessionを確認し、ユーザログイン情報がない場合はresponseで401
 コードを返却
 →毎回sessionからログイン情報をチェックするfilterなどを活用

こんな感じになるんでしょうか。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-05-18 17:15
引用:
ステータスコード401を送信することで擬似的に実現することができるでしょう。


引用:
強引に 401応答を返すしか無いのでは。


おそらく無理です。多くのブラウザは 401 を受け取ったら記憶している Authorization ヘッダを自動的に送出してしまうでしょう。406 が返ってくれば認証情報を破棄する可能性はあるかもしれないですけど。

本当に再入力を促すのであれば、レルムを都度変えるとかする必要がありそうですよ。

--
追加。401 を 2回返せば、ブラウザも認証が無効であることに気づくかもしれないですね。

[ メッセージ編集済み 編集者: 未記入 編集日時 2005-05-18 17:21 ]

スキルアップ/キャリアアップ(JOB@IT)