You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel项目无password_resets表仅用forgot_password_token重置密码如何实现

Laravel重置密码功能调整方案

一、核心修改说明

现有代码主要存在更新逻辑错误、变量未定义、参数不匹配三类问题,按以下步骤调整即可满足需求:


二、逐模块调整代码

1. 控制器代码调整

class ForgetPasswordController extends Controller
{
    public function showForgetPasswordForm()
    {
        return view('auth.forgetPassword');
    }

    public function submitForgetPasswordForm(ForgetPasswordRequest $request)
    {
        $validated = $request->validated();
        $forgot_password_token = Str::random(64);

        // 修正查询条件,更新对应用户的重置令牌(而非插入新用户)
        DB::table('poll_users')
            ->where('email', $validated['email'])
            ->update([
                'forgot_password_token' => $forgot_password_token
            ]);

        Mail::send('email.forgetPassword', ['forgot_password_token' => $forgot_password_token], function ($message) use ($request) {
            $message->to($request->email);
            $message->subject('Reset Password');
        });

        return back()->with('message', 'We have e-mailed your password reset link!');
    }

    // 修正参数名和路由参数匹配
    public function showResetPasswordForm($token)
    {
        return view('auth.forgetPasswordLink', ['forgot_password_token' => $token]);
    }

    public function submitResetPasswordForm(SubmitResetPasswordRequest $request)
    {
        $validated = $request->validated();

        // 通过token查询对应用户
        $user = DB::table('poll_users')
            ->where('forgot_password_token', $validated['forgot_password_token'])
            ->first();

        if(!$user){
            return back()->withInput()->with('error', 'Invalid token!');
        }

        // 直接更新对应用户密码,同时清空重置令牌防止重复使用
        DB::table('poll_users')
            ->where('id', $user->id)
            ->update([
                'password' => Hash::make($validated['password']),
                'forgot_password_token' => null
            ]);

        return redirect('/login')->with('message', 'Your password has been changed!');
    }
}

2. 重置表单代码调整(修正label属性错误)

@extends('layouts.app')

@section('content')
    <div class="container">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <div class="panel panel-default">
                    <div class="panel-heading">Reset Password</div>
                    <div class="panel-body">
                        <form class="form-horizontal" role="form" method="POST"
                              action="{{ route('reset.password.post') }}">
                            {{ csrf_field() }}
                            @if(session()->has('message'))
                                <div class="alert alert-success">
                                    {{ session()->get('message') }}
                                </div>
                            @endif
                            @if(session()->has('error'))
                                <div class="alert alert-danger">
                                    {{ session()->get('error') }}
                                </div>
                            @endif
                            <input type="hidden" name="forgot_password_token" value="{{ $forgot_password_token}}">
                            <div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
                                <label for="password" class="col-md-4 control-label">Password</label>
                                <div class="col-md-6">
                                    <input type="password" id="password" class="form-control" name="password" required autofocus>
                                    @if ($errors->has('password'))
                                        <span class="text-danger">{{ $errors->first('password') }}</span>
                                    @endif
                                </div>
                            </div>
                            <div class="form-group{{ $errors->has('password_confirmation') ? ' has-error' : '' }}">
                                <label for="password_confirmation" class="col-md-4 control-label">Confirm Password</label>
                                <div class="col-md-6">
                                    <input type="password" id="password_confirmation" class="form-control"
                                           name="password_confirmation" required>
                                    @if ($errors->has('password_confirmation'))
                                        <span class="text-danger">{{ $errors->first('password_confirmation') }}</span>
                                    @endif
                                </div>
                            </div>
                            <div class="form-group">
                                <div class="col-md-8 col-md-offset-4">
                                    <button type="submit" class="btn btn-primary">
                                        Reset Password
                                    </button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
@endsection

3. 表单验证类调整

ForgetPasswordRequest无需修改,保持现有配置即可

SubmitResetPasswordRequest调整(补充token必填规则)

class SubmitResetPasswordRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'password' => 'required|string|min:6|confirmed',
            'forgot_password_token' => 'required|string'
        ];
    }

    public function withValidator($validator)
    {
        return $validator->errors()->all();
    }
}

4. 路由配置无需修改,现有配置已经符合需求


三、额外注意事项

  • 邮件模板email.forgetPassword中需要拼接正确的重置链接,示例写法:<a href="{{ route('reset.password.get', $forgot_password_token) }}">重置密码</a>
  • 可以给forgot_password_token字段加过期逻辑,比如新增forgot_password_expired_at字段,查询时校验有效期,提升安全性

内容的提问来源于stack exchange,提问作者Olga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:06:03