laravel - 更新密码时停止用户退出
问题描述
我正在添加一些实现,允许用户在管理面板中更新密码,前提是他们提供了正确的当前密码。
我面临的问题是更新密码时的使用被注销,因为password_hash
会话中不再匹配,我知道这一点,因为我已经注释掉了中间件AuthenticateSession
。
我可以看到这里有一个password_hash
带有默认驱动程序后缀的会话值的检查。
if ($request->session()->get('password_hash_'.$this->auth->getDefaultDriver()) !== $request->user()->getAuthPassword()) {
$this->logout($request);
}
似乎我总是打这个,尽管在更新密码时我将会话变量设置为用户的新密码。
$user->password = Hash::make($request->input('password'));
$user->save();
auth()->guard('web')->login($user, true);
$request->session()->put([
'password_hash_' . auth()->getDefaultDriver() => $user->getAuthPassword(),
]);
即使这样,我还是使用了注销方法,显然我不想删除中间件,因为它在帐户被盗用时很有用。
解决方案
更改密码后,您不需要重新登录用户。
您只需要根据当前类似Hash::check($request->current_password, $this->User->password)
或类似的方法检查请求密码
您可以随时查看Illuminate\Foundation\Auth\ResetsPasswords
该类以了解 laravel 是如何实现它的
这是检查当前密码的更新密码方法的示例
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\User $user
* @return \Illuminate\Http\JsonResponse
*/
public function updatePassword(Request $request)
{
if (!(Hash::check($request->current_password, $this->User->password))) {
return response()->json([
'status' => 'error',
'message' => 'Your current password is incorrect. Please try again.'
], 403);
}
if (strcmp($request->current_password, $request->new_password) == 0) {
return response()->json([
'status' => 'error',
'message' => 'New Password cannot be the same as your current password. Please choose a different password.'
], 403);
}
$validatedData = $request->validate([
'current_password' => 'required',
'new_password' => 'required|strong_password|string|min:6|confirmed',
]);
try {
$this->User->password = bcrypt($request->new_password);
$this->User->save();
return response()->json([
'status' => 'success',
'message' => 'Your password has been updated',
], 200);
} catch (\Exception $e) {
return response()->json([
'status' => 'error',
'message' => $e->getMessage()
], 500);
}
}
推荐阅读
- android - 无法将元素添加到我从 firebase 获得的 Arraylist
- ios - 我无法在 iOS 14 中为具有 UIDatePickerStyle.inline 的 UIDatePicker 更改文本颜色
- azure-devops - 在 Azure 管道之间传递变量
- python-3.x - 连接来自两个不同来源的两个数据帧。如果数据框丢失,则无法处理情况
- tensorflow - 以最大验证准确度停止训练。这是一个好习惯吗?
- typescript - typescript的Int8ArrayConstructor类型定义可以简化吗
- javascript - Input values not resetting - vuejs
- java - 如何使用 Java 中的另一个对象创建一个对象?
- r - RStudio 中的 SparkR:sparkR.session:JVM 在 10 秒后未准备好
- javascript - 如何在异步函数中处理异步承诺拒绝