Laravel 5.5结合MongoDB重写密码重置功能问题咨询
解决Laravel 5.5 + MongoDB下密码重置适配自定义用户字段的问题
刚好我之前处理过类似的Laravel迁移到MongoDB的场景,你的问题核心在于Laravel默认的密码重置系统依赖它预设的用户字段(比如email、password),但你的用户表用的是usrEmail、usrPassword,再加上自定义的MD5加盐加密规则,所以得从模型和控制器两个核心层面来改造,具体步骤如下:
1. 改造User模型,适配自定义字段与密码规则
Laravel的认证和密码重置系统会调用模型内的核心方法,你需要在User.php里重写这些方法,让它们指向你的自定义字段:
<?php namespace App; use Illuminate\Notifications\Notifiable; use Jenssegers\Mongodb\Eloquent\Model as Eloquent; use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; use Illuminate\Auth\Authenticatable; use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; use Illuminate\Auth\Passwords\CanResetPassword; class User extends Eloquent implements AuthenticatableContract, CanResetPasswordContract { use Authenticatable, CanResetPassword, Notifiable; // 指定MongoDB集合名称(如果和模型名不一致需设置) protected $collection = 'users'; // 允许批量赋值的字段 protected $fillable = ['usrEmail', 'usrPassword', 'usrPasswordSalt', 'usrActive', 'usrEmailConfirmed', 'is_delete', 'usrlId', 'lastlogin']; // 重写:指定用户认证标识的字段名(默认是email) public function getAuthIdentifierName() { return 'usrEmail'; } // 重写:返回用户认证标识的值 public function getAuthIdentifier() { return $this->usrEmail; } // 重写:返回用户密码的字段(默认是password) public function getAuthPassword() { return $this->usrPassword; } // 重写:密码重置时获取用户邮箱的方法 public function getEmailForPasswordReset() { return $this->usrEmail; } }
2. 自定义密码重置控制器逻辑
默认的密码重置控制器依赖Laravel自带的Trait,你需要重写核心方法来适配你的字段和加密规则:
改造ForgotPasswordController.php
重写发送重置链接的逻辑,让系统按usrEmail查找用户,并匹配你的用户状态校验规则:
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\SendsPasswordResetEmails; use Illuminate\Http\Request; use App\User; class ForgotPasswordController extends Controller { use SendsPasswordResetEmails; // 重写发送重置链接的核心逻辑 public function sendResetLinkEmail(Request $request) { $this->validateEmail($request); // 按你的用户表规则查找符合条件的用户 $user = User::where('usrEmail', $request->email) ->where('usrActive', '1') ->where('usrEmailConfirmed', '1') ->where('is_delete', 0) ->whereIn('usrlId', [1,2,5,6]) // 和登录逻辑保持一致的角色限制,可选 ->first(); if (!$user) { return back()->withErrors(['email' => trans('passwords.user')]); } // 发送密码重置通知 $user->sendPasswordResetNotification($this->broker()->createToken($user)); return back()->with('status', trans('passwords.sent')); } }
改造ResetPasswordController.php
重写密码重置的逻辑,用你的MD5加盐规则生成新密码并更新用户:
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\ResetsPasswords; use Illuminate\Http\Request; use App\User; class ResetPasswordController extends Controller { use ResetsPasswords; // 密码重置成功后的跳转路径 protected $redirectTo = '/home'; // 重写密码重置核心逻辑 public function reset(Request $request) { $this->validate($request, $this->rules(), $this->validationErrorMessages()); // 查找符合条件的用户 $user = User::where('usrEmail', $request->email) ->where('usrActive', '1') ->where('usrEmailConfirmed', '1') ->where('is_delete', 0) ->first(); if (!$user) { return back()->withErrors(['email' => trans('passwords.user')]); } // 用你的自定义加密规则生成新密码 $newPassword = md5(env('MD5_Key'). $request->password. $user->usrPasswordSalt); $user->usrPassword = $newPassword; $user->save(); // 重置成功后自动登录用户 $this->guard()->login($user); return redirect($this->redirectTo)->with('status', '密码重置成功!'); } }
3. 额外注意事项
- 确保你的
User模型正确实现了CanResetPasswordContract接口并引入CanResetPasswordTrait,这是密码重置功能的基础。 - 测试时要确认用户的
usrPasswordSalt字段存在且有值,因为你的密码加密逻辑完全依赖这个盐值。 - 如果需要自定义密码重置邮件的内容,可以在
User模型里重写sendPasswordResetNotification方法,替换默认的通知类。
内容的提问来源于stack exchange,提问作者Sarath TS
相关产品推荐
相关产品推荐

