通过Mutator Laravel 5.4更改BCrypt密码时不匹配

时间:2017-04-04 13:53:14

标签: php eloquent laravel-5.4 mutators

我有一个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

2 个答案:

答案 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%的时间会失败。

很抱歉,感谢大家的帮助,希望这有助于将来:)