表題の通り、Laravelでパスワードをさかのぼってチェックしたい場合、どうしたらいいのでしょうか?
→パスワードの世代チェックとなります。
生徒の情報を登録するページがあると仮定し、
パスワードは別途別のテーブルで管理する仕様です。
流れとしては、登録処理をしたら、
studentsテーブルにデータを挿入と同時にパスワードの情報をパスワード管理用のテーブルにインサート
テーブルは以下のようになっています。
studentsテーブル
student_id 1
student_name 'hoge'
email 'aaa@gmail.com'
created_at
updated_at
↑
・student_idは連番
student_passwordsテーブル(パスワード管理用のテーブル)
student_id 1
password ハッシュ化されている。egr$erwr
created_at
↑
・student_idはauto_incrementsではない。
・student_idとcreated_atでunique制約
上記のような場合、以下のようにデータが登録されていきます。
student_id 1を登録し、パスワードを3回変更したとする。
studentsテーブル
student_name 'hoge'
email 'aaa@gmail.com'
created_at 2021/10/12 14:00:00
updated_at
student_passwordsテーブル(パスワード管理用のテーブル)
student_id 1
password ハッシュ化されている。egr$erwr
created_at 2021/10/12 14:00:00
student_id 1
password ハッシュ化されている。asdf42
created_at 2021/10/12 15:00:00
student_id 1
password ハッシュ化されている。sdvf24
created_at 2021/10/12 16:00:00
ここから本題なのですが、パスワードを入力したときに、
student_id 1
password ハッシュ化されている。asdf42
created_at 2021/10/12 15:00:00
student_id 1
password ハッシュ化されている。sdvf24
created_at 2021/10/12 16:00:00
のパスワードまで許容し、
student_id 1
password ハッシュ化されている。egr$erwr
created_at 2021/10/12 14:00:00
のパスワードは許容しない場合はどのように実装したらいいでしょうか?
今自分の頭の中にあるのは、
①student_id 1のデータを全て取得して、最新順にソートする
②入力したパスワードとはハッシュ化されたパスワードを順番にチェックしていく
③事前にパスワードを何世代まで許可しておくか決めておき、その世代数より前のパスワードだった場合エラー
こんな方針でいいのでしょうか?
もし上記で問題ない場合、②をどのように書いていこうか悩んでいます。
現状はこんな感じです。
student_idをもとに対象のパスワードテーブルのレコードを全件取得し最新順にソート
$this->where('student_id', $studentId)->orderBy('created_at', 'desc')->get(); ↓コレクションで取得 student_id 1 password ハッシュ化されている。asdf42 created_at 2021/10/12 16:00:00 student_id 1 password ハッシュ化されている。sdvf24 created_at 2021/10/12 15:00:00
②の部分で、
$password→フォームで入力されたパスワード $foo = 2;←許容するパスワード世代 if (!password_verify($password, コレクション配列のパスワードをどのように順番に照合させていくかが書き方がわからない)) { return false; }
入力したパスワードとコレクションで取得したパスワードの情報を順番にどのように照合させて不一致か判定すればいいのでしょうか?