Laravel 5.2 如何在遵循重置密码路径时强制注销

Laravel 5.2 如何在遵循重置密码路径时强制注销,laravel-5.2,Laravel 5.2,我有一个工作密码重置过程,通过以下途径: Route::group(['middleware' => [], 'namespace' => 'Auth'], function () { Route::get('/password/reset/{token?}', ['as' => 'site.password.showResetForm', 'uses' => 'PasswordController@showResetForm']); Route::pos

我有一个工作密码重置过程,通过以下途径:

Route::group(['middleware' => [], 'namespace' => 'Auth'], function () {
    Route::get('/password/reset/{token?}', ['as' => 'site.password.showResetForm', 'uses' => 'PasswordController@showResetForm']);
    Route::post('/password/email', ['as' => 'site.password.sendResetLinkEmail', 'uses' => 'PasswordController@postEmail']);
    Route::post('/password/reset', ['as' => 'site.password.reset', 'uses' => 'PasswordController@reset']);
});
如果有人当前已登录到计算机,则会出现我的问题。在这种情况下,当用户单击电子邮件中的链接时,PasswordController@showResetForm永远不会执行,其主页将在新选项卡中打开。是否有办法强制当前用户注销,以便可以继续重置密码?

调用
Auth::logout()代码

如果由于用户登录而从未显示
showretform
,则需要创建一个临时页面,在该页面中调用上述函数,然后重定向到密码重置页面:

public function do_password_reset()
{
    Auth::logout();
    return redirect()->route('PasswordController@showResetForm');
}

(请记住为此功能添加相关路由。)

我没有创建其他路由,而是重写了用于将用户路由到身份验证密码重置视图的showResetForm功能,该视图位于

vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.php
为此,请在您的重置密码控制器中添加以下内容:

public function showResetForm(Request $request, $token = null)
{
    $this->guard()->logout();
    $request->session()->flush();
    $request->session()->regenerate();

    return view('auth.passwords.reset')->with(
        ['token' => $token, 'email' => $request->email]
    );
}

一切正常,这应该是您需要添加的唯一代码。

至于编辑Lawrence建议的ResetPasswordController,您可能需要从其构造函数中删除来宾中间件:

$this->middleware('guest');

这个中间件将经过身份验证的用户重定向到根页面,这样可以防止已经登录的用户注销。

我同意接受的答案,但更喜欢这种方法。感谢您登录Firefox。请求重置密码电子邮件。在chrome中打开“重置密码”电子邮件,单击链接,重置密码。Laravel将尝试将您从chrome注销,但您仍将登录FF和任何其他浏览器。这与预期一样,
Auth::logout()
仅将您从当前浏览器注销。如果要从所有设备注销用户,可以从
会话
表中删除用户的所有会话(假设您正在使用数据库驱动程序进行会话)。