play 2.1 フレームワークを使用してログイン機能を実装しようとしています。最初はパスワードの平文保存を使用していました (すべてのテストが成功しました) ので、JBcrypt ライブラリを使用して拡張機能を作成しました。私のコードは正しいはずです(https://github.com/yesnault/Play20StartApp/tree/master/appで使用されている原則に従っても)。ただし、同じログイン テストケースを実行しようとすると、失敗します。BCrypt は「無効なソルト バージョン エラー」を返します。原因を調べましたが、問題が見つかったと思います。テストを実行する前にいくつかの初期テスト データを取得するために、次のように定義されたユーザーを含む test-data.yml ファイルを読み込みます。
- !!models.Person
ID: 123
lastName: Tom
firstName: Tom
password: secret
私の Person クラス コンストラクターでは、パスワードは Bcrypt の hashpw() メソッドを使用してハッシュされ、ハッシュされたパスワードはユーザー オブジェクトに格納されます。ただし、現在の問題は、yaml パーサー (?) がコンストラクターを使用せず、空の Person オブジェクトを作成し、その値を手動で入力することです (少なくとも私はそう思います)。したがって、パスワードはハッシュされておらず、値は「secret」です。そのため、ログイン機能をテストして BCrypt.checkpw() を使用しようとすると、「secret」と「-bcryptsalt+hashedpassword」ではなく「secret」と「secret」が比較されるため、「salt version invalid」というエラーが発生します。 ', 'secret' には必要なソルト形式がないなどの理由で.
だから私の質問は: yml ファイルでメソッドを呼び出すことは可能ですか? 例えば:
- !!models.Person
bebrasID: 123
lastName: Tom
firstName: Tom
password: BCrypt.hashpw('secret', BCrypt.gensalt())
または、値を手動で入力する代わりに、yml にコンストラクターを使用させる方法はありますか? 実際には、yaml が Person オブジェクトに保存する前に、平文のパスワードで BCrypt を使用するために、データの yml ファイルを使用するメソッドが必要なだけですか? これは可能ですか?