Spring アプリケーションに 2 要素認証を実装しようとしています。
望ましい状況
ユーザーに最初にユーザー名とパスワードを使用してログインしてもらいたいのですが、それらが正しい場合は、システムにランダムキーを生成させ、それをユーザーにメールで送信してもらいます。その後、システムは、トークンを入力してシステムにログインするだけでよいページにユーザーをリダイレクトする必要があります。
これまでに得たもの (疑似コード)
ユーザーが login.jsp ページに入ります。ユーザー名/パスワードでログインすると、システムは CustomMade AuthenticationException を送信します。AuthenticationFailureHandler では、例外に対して getAuthentication を実行します (非推奨であることは承知しています)。ただし、ユーザー名を使用してユーザーにトークンを送信します。その後、( request.getSession().setAttribute を使用して) セッションに例外を配置し、最後にシステムが login.jsp をリロードします。
Login.jsp はセッションで例外を確認し、トークン入力フィールドを表示します。ユーザーはトークン入力フィールドに入力してログインします。システムは、セッションの資格情報と指定されたトークンを使用してユーザーを認証します。
質問
ユーザー名/パスワードをセッションに保存するのは悪い習慣だと思います。私が考えた2つの可能な解決策:
ユーザー名/パスワードを確認した後。ユーザー名を静的変数または DB に保存します。ユーザーがトークンを入力しているときに、ユーザー名が変数/db にあるかどうかを確認し、トークンを確認します。トークンが正しい場合は、ユーザーでログインします。
ユーザー名/パスワードを確認した後、低い役割でユーザーをログインさせます。低い役割では、ユーザーはトークン ページにしか移動できません。有効なトークンを入力すると、システムはユーザーに新しい権限を与えます。
実装するのに最適なソリューションは何ですか?