将 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 次更新。 (大致)
该算法有效,但一旦密码被转换为哈希值并保存到数据库中,它就不会重定向到主页。相反,它会重定向到登录页面,指出登录凭据不正确。但是,如果我尝试登录,就可以了。我做错了什么?
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 次更新。 (大致)