ここに問題があります:Spring SecurityのRemember-me機能
2段階ログインプロセスを実装する必要があります。最初のステップ - ユーザーは名前/パスワードを入力し、認証されています。第2ステップ - ユーザは、セカンダリ選択画面を提示され、ここで単純なクリックによってオプションを選択することができる。これが完了すると、ユーザーは最終的に特定の一連のアクションに対して承認されます。これにより、現在のユーザーセッションの認証/承認プロセスが終了します。
標準の形式でSpring Securityを使用しています。最初のログイン画面は、デフォルトのSpring Securityスタックで処理され、ユーザーがいるとすぐにSpringはログイン処理を完了したものとして扱います。
セカンダリ選択画面は、完全にSpring Securityの外にあり、ユーザが選択すると、適切に設定されたオブジェクトがセキュリティコンテキストに戻されます。これは、期待どおりに現在のセッションで機能します。
最初のログイン画面で_spring_security_remember_meという名前のチェックボックスとオーバーライドされたUserDetailsService Beanで実装されているremember-me機能もあります。
セカンダリ選択画面オプションがない限り、remember-meは正常に機能します。セカンダリ画面はSpring Securityとは何の関係もないので、セカンダリオプションではremember-meメカニズムが有効にならず、最初のログインステップだけを思い出すことができます。この結果、記憶されたユーザーにオプションを尋ねる必要があり、これを回避することが任されています。
ログインフォームとセカンダリ選択の両方が同じページにあることはオプションではありません。
セカンダリの選択が必要な場合は、追加のCookieを使用し、認証に必要なパラメータを「静かに」渡すことができます。しかしこれは、Spring Securityが提供すべき手作りのものをたくさん用意しなければならないことを意味します。これはSpring管理セキュリティとRemember-Me機能の外にセキュリティロジックとトークンを置きます。
セキュリティ担当者には、二次提示オプションを受け入れるためのremember-me機能を「強制的に」強制する方法がありますか? Remember-Meフィルタで渡されたURLを「検査」し、remember-meオプションが選択されていることを識別できる場合は、このパラメータを追加できます。しかし、これは可能なようには聞こえません。
セカンダリ画面で別のログインフォームを使用して、必要な追加パラメータを「静かに」渡すことはできますか?この場合、ユーザー名/パスワードは少なくともクリアな形式では含めないことを私は知っています。オプションはそれができるように聞こえるが、私はまだRemember Meに何をするかを強制する簡単な方法があると信じている。それとも?
おかげで、 ニコライ
提案していただきありがとうございますが、DBデザインよりも複雑に見えます。RememberMeにはすでに単一のトークンにすべての値が含まれているように、ログイン自体にユーザー名と追加のパラメータを埋め込むことで実装しました。これが目標です。課題は、組み込みログインを実際に起動するための「2番目の」ログインフォームを理解することでした。その2番目のログインフォームは、実際には隠れたパラメータしか持たず、JavaScriptによって操作されます(つまり、ユーザーは再度ログインしているというヒントは得られません。 – Nikolay
2番目の画面の提出に実際のログインを考慮する必要がある理由はわかりません。 「ログイン」は、認証されたユーザーとの信頼できるセッションを確立します。他のすべては実際には認証コンテキストではなく、ユーザーのセッションのプロパティです。この2番目の選択を永続化される単純なユーザー構成値と見なすことはできませんか?また、あなたのDB設計が複雑になるというあなたの前提に従うことはできません.3つの列(ユーザー名、キー、値)を持つ単純なテーブルです。 –