0

我正在添加一些实现,允许用户在管理面板中更新密码,前提是他们提供了正确的当前密码。

我面临的问题是更新密码时的使用被注销,因为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(),
]);

即使这样,我还是使用了注销方法,显然我不想删除中间件,因为它在帐户被盗用时很有用。

4

1 回答 1

0

更改密码后,您不需要重新登录用户。

您只需要根据当前类似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);
        }
    }
于 2020-11-17T14:17:33.257 回答