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
相关产品推荐
相关产品推荐

