【问题标题】:BCrypt password not matching when changed through Mutator Laravel 5.4通过 Mutator Laravel 5.4 更改 BCrypt 密码不匹配
【发布时间】:2017-04-04 13:53:13
【问题描述】:

我有一个 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->email 与数据库中的匹配,但密码永远不会...

所以我在这个网站https://www.dailycred.com/article/bcrypt-calculator上用“秘密”字符串检查了它在数据库中生成的哈希值

我收到一条错误消息,提示 invalid salt revision 我很困惑,这是怎么回事? 我正在通过 Mutator 对密码进行哈希处理,看起来像这样

public function setPasswordAttribute($value) {
    $this->attributes['password'] = bcrypt($value);
}

根据下面其中一个 cmets 中已经给出的建议,我尝试了以下解决方案

    $hasher = new BcryptHasher();
    $hash = $hasher->make($value);

    $this->attributes['password'] = $hash;

通过 xDebug,我可以看出它两次进入 make() 方法,一次是在调用 Mutator 之前进行初始化,此时它会发送一组随机字符,然后它将运行 mutator 和 make() 命令正如预期的那样,使用字符串secret,我提取它生成的哈希并找到相同的问题...invalid salt revision

【问题讨论】:

  • 看起来您正在使用原始 bcrypt() 函数,但您可能需要创建 Illuminate\Hashing\BcryptHasher 的实例并调用 $hasher->make($value) 来创建包含 Laravel 环境中设置的所有内容的哈希
  • @markdwhite 没用 :(
  • 如果你通过一个 mutator 调用它,你认为 ModelFactory 会在创建时调用它吗?也许 factory(User::class)->create(['password' => $alreadyHashedPassword])
  • @markdwhite 我已经针对 xdebug 运行过它,它确实进入了 Mutator ......我不明白,如果我不能在 ModelFactories 中使用 mutators 那就意味着 ModelFactories 本身已经坏了,如果我不能像这样使用它们,工厂的意义何在?
  • 我明白你的意思,我可以看到会调用 mutator。看起来您在上次编辑后有更多信息要查看,所以我会留意更新。

标签: php eloquent laravel-5.4 mutators


【解决方案1】:

我在我的用户模型中使用了这个修改器,并且只有在需要时才会自动对密码进行哈希处理:

public function setPasswordAttribute($value)
{
    if( \Hash::needsRehash($value) ) {
        $value = \Hash::make($value);
    }
    $this->attributes['password'] = $value;
} 

【讨论】:

  • 不,同样的问题,例如对于“秘密”,它生成了以下哈希$2y$10$q05LuNs5TkLEvrLvv7.bx.26cRPdw1NXooGHUPvp7xPW/1AemmlJS 简单地在线检查很快就告诉我这个哈希对于那个字符串是无效的:(
【解决方案2】:

我发现了问题,这很愚蠢,所以,在我的 LoginController 中,我正在检查用户是否设置了活动标志以及电子邮件和密码匹配...

protected function attemptLogin(Request $request)
{
    return Auth::attempt([
        'email' => $request->input('email'),
        'password' => $request->input('password'),
        'active' => 1
    ]);
}

基本上,我的工厂有一个关于“活动”标志的 50/50 规则,所以只要生成的用户有活动标志 = 1,它就会工作,其他 50% 的时间它会失败。

对不起,谢谢大家的帮助,希望这对将来的人有所帮助:)

【讨论】:

    猜你喜欢
    • 2017-12-07
    • 2019-09-05
    • 1970-01-01
    • 2019-01-09
    • 2018-02-14
    • 2017-07-30
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    相关资源
    最近更新 更多