0

「鶏の卵」の問題があります。アプリケーションでは、UserDetailsS​​ervice を使用してユーザーを取得します (ユーザー情報を DB に保存するのではなく、サードパーティのサービスを使用して実際にすべての情報を取得します)。

最近、アカウントの有効化機能が追加されました。登録後、アクティベーションメールをユーザーに送信し、ユーザーがそれをクリックすると、ユーザーをアクティブとしてマークし、ログインページにリダイレクトします。ユーザーは、ACTIVE ステータスの場合にのみログインできます。問題は、ユーザーがログインしていない場合でも、アカウントをアクティブ化した日からユーザーに課金を開始することです。どうすれば (おそらく春のセキュリティを使用して) これらのプロセス (アクティブ化とログイン) をほぼ同時に行うことができますか? ユーザーがアカウントをアクティブ化しただけの場合は課金したくありません。(アクティブ化後に) ログインした場合にのみ課金したいと考えています。それで、実際に「ユーザーがアクティベーションリンクをクリックしてログインすると、ステータスがACTIVEに変更されます(ただし、ACTIVEの場合にのみログインできます)」という方法で実際に行うことができます。

問題の説明が十分に明確でない場合は申し訳ありません

フィードバックをいただければ幸いです。

ありがとう!

4

1 に答える 1

0

私があなたの要件を正しく理解していれば、アプリケーションへの 2 つの異なるエントリ ポイント (ログイン ページ) が必要になります。

  1. まだアクティブ化されていないユーザーのアクティブ化 (最初のログイン) 用の 1 つ。
  2. アクティブなユーザー向けの別の「通常の」もの。

問題は、認証ロジックがコンテキストに依存し、上記のどのページが認証を開始したかを認識する必要があることです。ただし、フレームワークはそのようなまれなユースケース用に設計されていないため、認証プロバイダーは、ログインフォームが実際に送信された URL については知りません。

解決する必要があるのは、その情報に従って認証要求を処理する認証プロバイダーにコンテキスト情報をリレーすることです (つまり、url1 からログインしているアクティブでないユーザーのみを認証し、url2からログインしているアクティブなユーザーのみを認証します)。これを実現するには何百もの方法が考えられますが、考えられる解決策の 1 つは、2 つの異なる URL に送信された認証リクエストをインターセプトする 2 つの異なる認証フィルターを配置することです。詳細は以下のとおりです。

  1. WebAuthenticationDetailsSource認証要求の URI を格納および公開する既存のandの独自のカスタム バージョンをWebAuthenticationDetails(できれば後者をサブクラス化することによって) 作成します。(これは、認証プロバイダーが条件付きロジックを実装できるコンテキスト情報になります。)
  2. の 2 つの異なるインスタンスを設定UsernamePasswordAuthenticationFilterし、フィルタ チェーンに挿入します。filterProcessesUrlそれぞれの属性を/j_spring_security_check_active_userおよびに設定し、上記で作成したカスタムを両方に/j_spring_security_check_nonactive_user挿入します。AuthenticationDetailsSource
  3. DaoAuthenticationProvider.additionalAuthenticationChecks()次の方法でサブクラスを オーバーライドします。
    • 上記で作成したオブジェクトに保存されている URI を取得しWebAuthenticationDetailsます ( 経由でアクセスできますauthentication.getDetails()) 。
    • ユーザーが URI に従ってアクティブ/非アクティブであることをアサートしAccountStatusException、アサーションが失敗した場合にスローします。
    • アサーションが成功した場合は、スーパークラスに委譲することを忘れないでください。
  4. 投稿の冒頭で説明した 2 つの異なるログイン ページを作成し、ログイン フォームが資格情報をそれぞれの URL ( /j_spring_security_check_nonactive_uservs. /j_spring_security_check_active_user) に送信するようにします。
于 2013-04-16T23:57:41.030 に答える