重置密码时避免“自动登录”

Posted

技术标签:

【中文标题】重置密码时避免“自动登录”【英文标题】:Avoid "auto login" when password is reset 【发布时间】:2018-03-13 11:49:30 【问题描述】:

我正在做一个 Laravel 项目。我不是最初的开发者,所以如果我犯了错误,请原谅我并解释它是什么。

在这个项目中,我们有一个请求新密码的模块。提交表单后,用户会被重定向到route('password.request'),我相信它隐藏在框架中。

问题是当用户获得新密码时,他会自动登录并可以访问页面。但他不应该这样做,因为他没有管理员权限。

所以我尝试注销并将用户重定向到主页,但没有任何运气。

有人可以解释为什么 laravel(或“我”,因为它们是我尚未探索的项目的某些部分)这样做以及如何解决这个问题?

reset.blade.php(请求新密码的表单)

form class="form-horizontal" role="form" method="POST" action=" route('password.request') ">
     csrf_field() 

    <input type="hidden" name="token" value=" $token ">
....

我的自定义注销路线:

Route::get('/customLogout', 'Auth\LoginController@customLogout');

resetPasswordController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords;

class ResetPasswordController extends Controller

    /*
    |--------------------------------------------------------------------------
    | Password Reset Controller
    |--------------------------------------------------------------------------
    |
    | This controller is responsible for handling password reset requests
    | and uses a simple trait to include this behavior. You're free to
    | explore this trait and override any methods you wish to tweak.
    |
    */

    use ResetsPasswords;

    /**
     * Where to redirect users after resetting their password.
     *
     * @var string
     */
    protected $redirectTo = '/customLogout';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    
        $this->middleware('guest');
    

LoginController.php 中的方法

public function customLogout()
        //Session::flush();       
        return redirect()->route('/');
            

【问题讨论】:

正如您提到的“问题是当用户获得新密码时,他会自动登录并可以访问页面。” .基本上这是实际的流程。如果您重设密码。您应该自动登录到站点。那你有什么问题? @Tej,据我了解,Op 不希望它自动登录。 那么只有一种方式。您必须刷新会话并调用注销功能。用户将重定向到主页。但我不推荐这种方法。 你的路线是否列在php artisan route:list的结果中? @Laerte 命令返回:"constant SERVER_URL already defined" 【参考方案1】:

好的,我(终于)找到了方法。

我重写了名为“resetPassword”的函数并删除了登录代码。

这个函数来自框架(不记得文件,如果有人可以帮忙的话 :S ) 我覆盖了我的 ResetPasswordController.php 中的函数

protected function resetPassword($user, $password)
    
        $user->forceFill([
            'password' => bcrypt($password),
            'remember_token' => Str::random(60),
        ])->save();

        //$this->guard()->login($user);
    

这会使我的密码更改并自动重定向到主页。

编辑:哦,别忘了在你的包含中添加这个:

use Illuminate\Support\Str;

【讨论】:

ResetPasswordController.php 文件路径:\vendor\laravel\framework\src\Illuminate\Foundation\Auth\RegisterPassqwordController.php 在供应商目录中更改文件是非常非技术性的。不建议。 @UtkarshVishnoi 什么是 forceFill? @jayantrawat 我不记得了。那是 4 年前的事了,从那以后我就没有练习过。【参考方案2】:

转到 auth/ResetPasswordController

并重写此方法 resetPassword 方法并使其像这样

/**
 * Reset the given user's password.
 *
 * @param  \Illuminate\Contracts\Auth\CanResetPassword  $user
 * @param  string  $password
 * @return void
 */
protected function resetPassword($user, $password)

    $this->setUserPassword($user, $password);
    $user->save();
    event(new PasswordReset($user));

在控制器顶部添加此行以避免任何错误

use Illuminate\Auth\Events\PasswordReset;

【讨论】:

为避免错误在顶部控制器添加更多此行:使用 Illuminate\Support\Facades\Hash;使用 Illuminate\Support\Str;

以上是关于重置密码时避免“自动登录”的主要内容,如果未能解决你的问题,请参考以下文章

通过Gitlab API更改密码时,在登录时禁用密码重置

密码重置电子邮件中的 Firebase 传递状态(继续应用链接)

windows 2008 重置开机密码

任意用户密码重置:重置凭证未校验

任意用户密码重置:重置凭证可暴破

Django 在密码重置时不会重定向到正确的路径