在yml-parser生成User对象并插入密码值之前,BCrypt: hash yml密码属性



我正在尝试使用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()方法对password进行散列,然后将散列后的密码存储在user对象中。但现在的问题是(至少这是我认为),yaml解析器(?)不使用我的构造函数,但只是创建一个空的Person对象,并手动填写其值。所以密码没有散列,值为'secret'。因此,当我尝试测试登录功能并使用BCrypt.checkpw()时,它将'secret'与'secret'进行比较,而不是'secret'与'-bcryptsalt+ hashhedpassword ',这就是为什么它给出错误'盐版本无效',因为'secret'没有所需的盐形式等。

我的问题是:它是可能调用一个方法在一个html文件?例如:

- !!models.Person
    bebrasID:   123
    lastName:   Tom
    firstName:  Tom
    password:   BCrypt.hashpw('secret', BCrypt.gensalt())

或者有一些方法我可以强迫yml使用我的构造函数,而不是手动填充值?所以实际上,我只需要一个方法使用我的数据mysql文件使用BCrypt的明文密码之前,yaml存储在Person对象?这可能吗?

我认为不可能在yml内部调用函数,因为它只是一个"人类友好的数据序列化标准",正如它在www.yaml.org中所说的那样,你不能序列化函数。我建议您将散列密码放在yml中。打电话给BCrypt。hashpw('secret', BCrypt.gensalt()))在UnitTest中并记录结果,然后确保它始终具有相同的结果,并且只在yml.

中使用该文本

最新更新