1

JavaベースのWebアプリケーション(モバイルクライアントとWebクライアントにサービスを提供します)のサーバー側で作業しており、ユーザー認証を実装する必要があります。本番環境では、ロードバランサーを備えた2台のサーバー(複製、同じDBに対して動作)があります。以前はSpringセキュリティを使用していたので、これが私にとって最も直感的な方法ですが、ここに私の問題があります。

Springセキュリティは(ユーザーがログインしたときに)DBに対してユーザーを1回認証し、その後の要求はセッションベースのトークンを使用して処理および認証されます。ここで、本番サーバーの1つがダウンしていると、セッションが失われます。つまり、ユーザーはある種の「不正な」応答を受け取ります。どうすればこれに対処できますか?

私は3つのオプションを考えました

  1. redisなどのKey-Valueストアを使用して、トークンをそこに保存します。そうすると、Springsのコアコードに干渉する必要があると思います。1回はユーザーがログインするとき(トークンをKey-Valueストアに保存する)、もう1回はユーザーを認証するとき(SpringのIn-ではなくこのKey-Valueストアに対して認証する)です。メモリHttpSessionSecurityContextRepository)。
  2. すべてのリクエストでDBに対してユーザーを認証する方法でSpringセキュリティを使用します(それが可能かどうかはわかりません)。
  3. スプリングセキュリティを使用せず、DBに対してすべてのリクエストを認証するために、フィルターまたはインターセプターを作成するだけです。これは、2つのことを意味します。1つは、クライアントがすべてのリクエスト(おそらくヘッダー内)にユーザー名とパスワードを適用する必要があること、もう1つは、すべてのリクエストについてDBにクエリを実行する必要があることです。

これらは私の考えです。もしあれば、それらについての洞察と新しい提案を得たいと思います。

4

1 に答える 1

0

ユーザーがセッション全体で維持する状態はどうですか?このような状況では、サーバーに障害が発生するとデータが失われます。

ここでスティッキーセッションメカニズムから始めて、認証をそのままにしておくのが最善だと思います。

スティッキーセッションはロードバランサーで構成でき、通常は次のことを意味します。

  • IP Aからの使用により、サーバーS1でアプリケーションが開かれると、後続のすべての要求はこのサーバーにリダイレクトされますが、次のユーザーはサーバーS2に自動的に接続されます(ロードバランサーがそのような決定を行います)。したがって、全体として、たとえば10人のユーザーが同時に作業している場合、そのうち5人はサーバーS1に接続され、残りはサーバーBに接続されます。

各リクエストを認証することは良い考えではないと思います(Web 2、ajaxリクエストについて考えてください)-これにより、サーバーとデータベースの負荷が高くなり、その結果、多くのユーザー/リクエストを処理できなくなります同時に。

お役に立てれば

于 2012-09-20T05:40:51.567 に答える