1

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 ファイルを使用するメソッドが必要なだけですか? これは可能ですか?

4

1 に答える 1

1

www.yaml.orgで述べられているように、ymlは単なる「人間に優しいデータシリアル化標準」であり、関数をシリアル化できないため、yml内で関数を呼び出すことはできないと思います。私がお勧めするのは、ハッシュ化されたパスワードを yml に入れることです。UnitTest 内で BCrypt.hashpw('secret', BCrypt.gensalt()) を呼び出して結果をログに記録し、常に同じ結果になるようにして、yml 内でそのテキストを使用します。

于 2013-03-22T15:49:30.907 に答える