を使用するときにHTTPセッションタイムアウトに対処するための認証サーバとして使用する(のが認証ためそれを呼びましょう)。 は、他の2つのアプリケーションに対してSSOを有効にしています(B for BusinessおよびC for Client)。私は<strong>Springアプリケーション</strong>を持ってどのようにSSO
SSO認証がリダイレクトによって行われます:
- ユーザーはBまたはC URLに行き、彼は認証のログインページにリダイレクトされます。ログインすると、またはアプリケーションにリダイレクトされます。
リダイレクトはorg.springframework.security.web.savedrequest.SavedRequest
にredirectUrlパラメータを用いて行われます。
ので、利用者は、BまたはCアプリケーションから来る、またはアプリケーション上の自分のアカウントに直接ログインすることのいずれか来ることができます。
私の問題は次のとおりです。ユーザーがアプリケーションに接続したい場合、アプリケーションにリダイレクトされると、彼はログインしません。 セッションタイムアウトが発生してセッションが破棄されると、ログインしたときに彼はBアプリケーションにリダイレクトされるのではなく、アプリケーションにリダイレクトされます。
考えられる解決策:
明白な方法は、HttpSessionの上でタイムアウトを無効にすることです:それはセキュリティ上のリスクがあるとして
<session-config> <session-timeout>-1</session-timeout> </session-config>
これは非常に良いアイデアではなく、認証サーバーに過負荷を与える脅威。
私は、タイムアウトを検出し、破棄するセッションの要求を保存するために、ApplicationListenerを追加しました。主なアイデアは、タイムアウト後に接続されるとユーザをリダイレクトすることでした。だから、成功した接続では、私は
AuthenticationSuccessHandler
の要求キャッシュをチェックして、リクエストが保存されているかどうか、そしてユーザーをリダイレクトしているかどうかを確認します。if (timeOutHandler.isTimeOut()) { redirectStrategy.sendRedirect(request, response, timeOutHandler.getRequest().getRedirectUrl()); timeOutHandler.clearSession(); return; }
このアプローチの問題は、私はタイムアウトを起こしたユーザの以前の知識を持っていないし、私はこのようなシナリオに終わるかもしれないということです。
- Bから来たユーザーアプリケーションは、タイムアウトを引き起こします。
- へのリダイレクト要求は、が格納されています。
- から別のユーザが来た場合、タイムアウトも発生します。
- Bにリダイレクトされた要求は、 への要求で上書きされ、Cにリダイレクトされます。
- 最初のユーザーが接続しようと、彼はアプリケーションCだから、
にリダイレクトされます、あなたが最善のアプローチとなりますどう思いますか、またはあなたがよりよい解決策を持っているのですか?
ありがとうございました。