从Laravel 5.3开始,新增了一个中间件:
\Illuminate\Session\Middleware\AuthenticateSession
虽然它确实有安全保障的好处,但如果用户更改密码,则还会导致用户注销(显示登录页面)。
在Laravel 5.5中,我们如何防止用户在更改密码时被强制注销(需要重新登录)?
\Illuminate\Session\Middleware\AuthenticateSession
虽然它确实有安全保障的好处,但如果用户更改密码,则还会导致用户注销(显示登录页面)。
在Laravel 5.5中,我们如何防止用户在更改密码时被强制注销(需要重新登录)?
无需更改中间件,只需在更改密码后“重新登录”用户:
<?php
//$user->passwordChangeMagicHere()
Auth::login($user);
//And the user is logged in again!
对我而言有效的方法是注销、清除会话,然后重新登录。
Auth::guard('web')->logout();
Session::flush();
Auth::guard('web')->login($this);
// $user - user model after password change
auth()->setUser($user);
针对 Laravel > 8.x 版本
当会话的 password_hash 与当前的 auth()->user()
不同时,Laravel 将自动注销用户。这是在中间件中完成的:
vendor/laravel/framework/src/Illuminate/Session/Middleware/AuthenticateSession.php
session()->put([
'password_hash_' . auth()->getDefaultDriver() => $user->getAuthPassword()
]);
例子:
session()->put([
'password_hash_web' => "$2y$10$...hashpasswordstoredondatabase"
]);
顺便提一下,有时您可能需要更新会话的password_hash。为了完成更新密码的过程,最好的方法是。
auth()->login($user, true);
$request->session()->put([
'password_hash' => $newUser->getAuthPassword(),
]);
auth()->user();
在我的 Laravel 8 项目中,以下是我从 manniL(使用 Auth::login
)和 Lukmon Awoyemi(使用记住我功能)的答案中得出的有效方法:
public function updatePassword(UpdatePasswordRequest $request) {
$user = $request->user();
$user->fill([
'password' => Hash::make($request->password),
])->save();
// make sure to re-login the user
Auth::login($user, !!$user->getRememberToken());
$request->session()->flash('status', 'Password updated!');
return redirect()->route('some.route');
}
UpdatePasswordRequest
是一个表单请求,用于验证给定的原始密码和新密码,检查提供的原始密码是否有效,并确认新密码。
这里的新增内容是首先检查记住令牌。此检查将返回一个令牌或 null
(如果未设置记住令牌)。此信息将转换为布尔值并提供给 login
函数。
像这样登录用户将确保会话中更新所有必要的密码和登录哈希以匹配新的密码哈希。因此,AuthenticateSession
中间件仍将识别用户已登录。此外,只有在密码更改之前记住用户才会被记住。
您可以使用update
方法而不是save
来解决它:
$user = auth()->user();
$user->update([
'password' => Hash::make($data['new_password']),
]);