将 md5 迁移到散列 Laravel 中的错误

Bug in Migrating md5 to hash in Laravel

该算法有效,但一旦密码被转换为哈希值并保存到数据库中,它就不会重定向到主页。相反,它会重定向到登录页面,指出登录凭据不正确。但是,如果我尝试登录,就可以了。我做错了什么?

AuthenticatesUsers.php

protected function attemptLogin(Request $request)
{
    $check = $this->guard()->attempt(
        $this->credentials($request), $request->has('remember')
    );
    if ($check === false)
    {
        $user = User::where('username','=',$request->input('username'))->first();

        if(isset($user)) {
            if($user->password == md5($request->input('password'))) { // If their password is still MD5
                $hashed_password = Hash::make($request['password']); // Convert to new format
                $user->password = $hashed_password;
                $user->save();

                return $this->guard()->attempt(
                    array(
                        'username'=>$request->input('username'),
                        'password'=>$hashed_password
                    ), $request->has('remember')
                );

            } else {
                // Redirect to the login page.
                return false;
            }
        }
    }
    return $check;
}

attempt 不采用散列密码,它采用您将从用户那里获得的密码(纯文本密码)。用户不知道其密码的散列版本,attempt 执行需要纯文本版本的散列检查。

如果您已经验证了用户及其凭据并有一个代表它们的用户实例,则您也不需要第二次调用 attempt。只需使用 login 登录即可。您不必通过 attempt 来重新查询数据库以获取用户,然后检查您知道正确的散列,因为您刚刚设置了它。

在某种程度上,您拥有的部分代码只是重新创建了 attempt 内部所做的事情。

另外,您不需要自己为用户查询数据库。对 attempt 的第一次调用将保存在它查询数据库时发现的 'user' 上。您可以从守卫那里检索它,这样您就不必再次查询数据库,$this->guard()->getLastAttempted()

进行这些更改将消除来自第二个 attempt 调用的 'bad credentials' 问题,因为它不会再被调用。这也会将您的查询从 3 select 和 1 次更新减少到 1 select 和 1 次更新。 (大致)