我正在尝试使用 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 对象,并手动填充它的值。所以密码没有经过哈希处理,并且具有“秘密”值。因此,当我尝试测试登录功能并使用 BCrypt.checkpw() 时,它会将“secret”与“secret”进行比较,而不是将“secret”与“-bcryptsalt+hashedpassword”进行比较,这就是它给出错误“salt version invalid”的原因',因为 'secret' 没有所需的盐形式等。
所以我的问题是:是否可以在 yml 文件中调用方法?例如:
- !!models.Person
bebrasID: 123
lastName: Tom
firstName: Tom
password: BCrypt.hashpw('secret', BCrypt.gensalt())
或者有什么方法可以强制 yml 使用我的构造函数而不是手动填充值?所以实际上,我只需要一种方法使用我的数据 yml 文件在 yaml 将其存储在 Person 对象中之前对纯文本密码使用 BCrypt?这可能吗?