【发布时间】: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