web-dev-qa-db-ja.com

電子メールに送信される動的URLを使用したSpringSecurityパスワード回復の実装ガイド

パスワードの回復は、これまで行ったことがないため、非常に難しいと感じました。

これまでのところ、次のようなWebアプリがあります。

Spring Security。パスワードが適切にハッシュされ、ユーザーロールが実装され、正しく機能します。

この戦略は、stackoverflowからの調査を示唆しています。

  1. ユーザーがパスワードを忘れた場合のボタンを押すと、メールアドレスが入力されます。
  2. 動的リンクが電子メールアドレスに送信されます
  3. ユーザーがメールアドレスでリンクを開く
  4. これにより、彼はパスワードリセットページにリダイレクトされます

知られていないこと:

  • リンクに動的な性質を与える方法-世代の方法
  • リンクにタイムアウトがあります-いくつかの質問がここで見つかりましたが、多くの場合、カスタムハンドラーまたはSpringセキュリティ機能の拡張が含まれます
  • このような動的リンクに応答するためのリクエストマッピングメソッド
  • 一時的なリンクの保存方法-データベース、セッションなど?

ご覧のとおり、リストは1つの質問に対して非常に厳しいものです。それで、あなたがそれを段階的に行う方法へのガイドリソースを提供できるかもしれないことを望んでいました。 SpringSecurityのドキュメントでこれについて多くを見つけることができなかったことに少し驚いた。ありがとう。

私は学生なので、特にJavaのコンテキストでそうするための業界のベストプラクティスを本当に知らないので、誰もが助けてくれることを本当に望んでいます。

14
Aubergine

この問題は、SpringSecurityとはあまり関係がありません。使用されているユーザーデータベースとパスワードエンコーダーの構造を知っていれば、実際には、データアクセス、Webコントローラー、および電子メールの送信を含むワークフローを実装しているだけです。リンクにはランダムなトークン文字列が含まれている必要があり(たとえば、SecureRandomとbase64エンコーダーを使用)、userIdとタイムスタンプ(リンクが有効なウィンドウを検証するため)とともにデータベースに保存されている必要があります。 。コントローラーは、着信要求からトークンを抽出し、トークンを使用してデータベースからデータをロードするだけです。タイムスタンプをチェックしてから、ユーザーをパスワード入力フォームに転送します。要件によっては、他のセキュリティの質問にも回答してもらいたい場合があります。次に、パスワードを検証してエンコードし、リセットリンクテーブルに保存されているuserIdと一致するアカウントに保存します。データベースから期限切れのリンクを削除するためにバッチジョブを実行することも理にかなっています。

Grails Spring Security UIプラグインにはすでに パスワードを忘れた オプションがあり、直接使用することも、参照として使用することもできます。

19
Shaun the Sheep

このユースケース用にJavaプロジェクトを実装しました。これは、オープンソースのGitHubにあります。

すべての説明があります(そして何かが足りない場合は私に知らせてください...)


ご覧ください: https://github.com/OhadR/Authentication-Flows

これは、auth-flowsを使用するクライアントWebアプリであり、READMEとすべての説明が含まれています。実装を指示します: https://github.com/OhadR/ oAuth2-sample/tree/master/authentication-flows

5
OhadR