在 Laravel 5.5 中更新用户密码后防止注销

7
从Laravel 5.3开始,新增了一个中间件:

\Illuminate\Session\Middleware\AuthenticateSession

虽然它确实有安全保障的好处,但如果用户更改密码,则还会导致用户注销(显示登录页面)。

在Laravel 5.5中,我们如何防止用户在更改密码时被强制注销(需要重新登录)?

7个回答

9

无需更改中间件,只需在更改密码后“重新登录”用户:

<?php
//$user->passwordChangeMagicHere()

Auth::login($user);
//And the user is logged in again!

这个可以在HTTP请求上运行,但如果我想通过CURL调用重置,该怎么办?让用户再次登录在这里无法奏效。我注意到,在更新密码时,用户总是被登出。不管是API调用还是HTTP方法都一样。你有其他方法来防止这种情况吗?尤其是对于CURL API更新。 - Jickson Johnson Koottala

8

对我而言有效的方法是注销、清除会话,然后重新登录。

Auth::guard('web')->logout();
Session::flush();
Auth::guard('web')->login($this);

这对我在使用Jetstream的Inertia堆栈开发我的Laravel 10应用程序时非常有帮助。 - Nick

1
对于 Laravel 版本大于 8.x:
更好的方式:
// $user - user model after password change
auth()->setUser($user);

1

针对 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"
]);

1

顺便提一下,有时您可能需要更新会话的password_hash。为了完成更新密码的过程,最好的方法是。

auth()->login($user, true);

 $request->session()->put([
            'password_hash' =>  $newUser->getAuthPassword(),
        ]);


重要的是在用户重新登录后再执行此操作,否则,对于进一步调用,需要进行以下操作:
auth()->user();


会返回 null。

0

在我的 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 中间件仍将识别用户已登录。此外,只有在密码更改之前记住用户才会被记住。


0

您可以使用update方法而不是save来解决它:

$user = auth()->user();

$user->update([
    'password' => Hash::make($data['new_password']),
]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接