我有一个Laravel 5.4项目,我试图运行一个简单的集成测试,检查用户是否可以正确登录,以便通过工厂生成新用户。
$user = factory(User::class)->create(['password' =>'secret']);
然后在我的测试中
$this->visitRoute('admin.login')
->submitForm('LOGIN', ['email' => $user->email, 'password' => 'secret'])
->seeIsAuthenticated()
->seeStatusCode(200);
用户从未通过身份验证,我可以确认$ user->电子邮件与数据库中的电子邮件匹配,但密码永远不会...
所以我用这个网站上的“秘密”字符串检查了它在数据库中生成的哈希值https://www.dailycred.com/article/bcrypt-calculator
我收到错误说invalid salt revision
我很困惑,这是怎么回事?
我通过Mutator散列密码,看起来像这样
public function setPasswordAttribute($value) {
$this->attributes['password'] = bcrypt($value);
}
根据以下评论中的建议,我尝试了以下解决方案
$hasher = new BcryptHasher();
$hash = $hasher->make($value);
$this->attributes['password'] = $hash;
通过xDebug,我可以告诉它进入make()方法两次,一旦在调用Mutator之前进行初始化,此时它会发送一组随机字符,然后它将运行mutator和make()命令正如预期的那样使用字符串secret
,我拉出它生成的哈希并找到相同的问题...... invalid salt revision
答案 0 :(得分:0)
我在我的用户模型中使用此mutator,只有在需要时才会自动对密码进行哈希处理:
public function setPasswordAttribute($value)
{
if( \Hash::needsRehash($value) ) {
$value = \Hash::make($value);
}
$this->attributes['password'] = $value;
}
答案 1 :(得分:0)
我弄清楚了问题,这很愚蠢,所以,在我的LoginController中,我检查用户是否设置了活动标记以及电子邮件和密码匹配...
protected function attemptLogin(Request $request)
{
return Auth::attempt([
'email' => $request->input('email'),
'password' => $request->input('password'),
'active' => 1
]);
}
基本上,我的工厂有一个关于'活动'标志的50/50规则,所以当生成的用户有活动标志= 1时它会工作,另外50%的时间会失败。
很抱歉,感谢大家的帮助,希望这有助于将来:)