Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过Mutator Laravel 5.4更改时,BCrypt密码不匹配_Php_Eloquent_Laravel 5.4_Mutators - Fatal编程技术网

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

Php 通过Mutator Laravel 5.4更改时,BCrypt密码不匹配,php,eloquent,laravel-5.4,mutators,Php,Eloquent,Laravel 5.4,Mutators,我有一个Laravel5.4项目,我正在尝试运行一个简单的集成测试,检查用户是否可以正确登录,为了做到这一点,我正在通过工厂生成一个新用户 $user = factory(User::class)->create(['password' =>'secret']); 然后在我的测试中 $this->visitRoute('admin.login') ->submitForm('LOGIN', ['email' => $user-&g

我有一个Laravel5.4项目,我正在尝试运行一个简单的集成测试,检查用户是否可以正确登录,为了做到这一点,我正在通过工厂生成一个新用户

    $user = factory(User::class)->create(['password' =>'secret']);
然后在我的测试中

    $this->visitRoute('admin.login')
         ->submitForm('LOGIN', ['email' => $user->email, 'password' => 'secret'])
         ->seeIsAuthenticated()
         ->seeStatusCode(200);
用户从未经过身份验证,我可以确认$user->email与数据库中的匹配,但密码从来没有

所以我用这个网站上的“secret”字符串检查了它在数据库中生成的散列

我听到一个错误,说
无效的盐修订版
我很困惑,这是怎么回事? 我通过一个变异子对密码进行哈希运算,看起来像这样

public function setPasswordAttribute($value) {
    $this->attributes['password'] = bcrypt($value);
}
根据下面一条评论中已经给出的建议,我尝试了以下解决方案

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

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

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

我在我的用户模型中使用此变量,密码仅在需要时自动散列:

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

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

protected function attemptLogin(Request $request)
{
    return Auth::attempt([
        'email' => $request->input('email'),
        'password' => $request->input('password'),
        'active' => 1
    ]);
}
基本上,我的工厂有一个关于“活动”标志的50/50规则,因此只要生成的用户的活动标志=1,它就会工作,其他50%的时间它就会失败


很抱歉,谢谢大家的帮助,希望这对以后的人有所帮助:)

看起来您正在使用原始bcrypt()函数,但是您可能需要创建一个lightize\Hashing\BcryptHasher实例并调用$hasher->make($value)创建包含Laravel中设置的所有内容的哈希environment@markdwhite不起作用:(如果您是通过一个mutator调用它,您认为ModelFactory会在创建时调用它吗?可能是factory(User::class)->create(['password'=>$alreadyHashedPassword])@markdwhite我对xdebug运行了它,它确实转到了Mutator…我不明白,如果我不能在模型工厂中使用Mutator,那么这就意味着模型工厂本身就坏了,如果我不能像这样使用它们,工厂的意义何在?我明白你的意思,我可以看到将调用Mutator。看起来你有更多的信息上次编辑后要查看的信息,因此我将查看更新。不,同样的问题,例如,对于“secret”,它生成了以下哈希值
$2y$10$Q05luns5Tklevrvv7.bx.26cRPdw1NXooGHUPvp7xPW/1AemmlJS
,只要在线检查就可以快速告诉我该哈希值对该字符串无效:(