Laravel重置密码:如何移除默认的6位密码长度验证限制
解决Laravel密码重置默认密码长度验证的重写问题
嘿,这个场景我太熟悉了——直接改vendor目录里的框架代码确实能临时解决问题,但完全不适合生产环境,Laravel本身就提供了优雅的扩展方式来搞定这个,不用碰核心文件。下面是具体步骤:
第一步:创建自定义的PasswordBroker类
我们需要继承框架默认的PasswordBroker,然后重写那个validatePasswordWithDefaults方法。在你的项目里新建一个文件app/Auth/Passwords/CustomPasswordBroker.php,内容如下:
<?php namespace App\Auth\Passwords; use Illuminate\Auth\Passwords\PasswordBroker as BasePasswordBroker; class CustomPasswordBroker extends BasePasswordBroker { /** * 重写默认的密码验证逻辑 * * @param array $credentials * @return bool */ protected function validatePasswordWithDefaults(array $credentials) { [$password, $confirm] = [ $credentials['password'], $credentials['password_confirmation'], ]; // 这里改成你需要的规则,比如密码长度≥1位 return $password === $confirm && mb_strlen($password) >= 1; } }
第二步:在服务容器中替换默认的PasswordBroker实现
接下来要告诉Laravel,当需要PasswordBroker类的时候,使用我们自定义的版本。打开app/Providers/AppServiceProvider.php,在register方法里添加绑定逻辑:
<?php namespace App\Providers; use App\Auth\Passwords\CustomPasswordBroker; use Illuminate\Auth\Passwords\PasswordBroker; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * 注册应用服务 * * @return void */ public function register() { $this->app->bind(PasswordBroker::class, function ($app) { // 获取框架默认的令牌生成器和用户提供者 $tokens = $app->make('auth.password.tokens'); $users = $app->make('auth')->createUserProvider(); // 返回我们自定义的Broker实例 return new CustomPasswordBroker($tokens, $users); }); } }
第三步:确保自定义验证规则一致
别忘了同步你自己的验证规则——也就是User::resetPasswordRules()里的密码规则,要和重写后的逻辑匹配,比如把密码规则改成:
public static function resetPasswordRules() { return [ 'email' => 'required|email', 'password' => 'required|string|min:1|confirmed', // 其他规则... ]; }
为什么这么做?
这种方式利用了Laravel的服务容器依赖注入特性,我们没有修改任何框架核心代码,而是通过替换绑定的方式实现了自定义逻辑。这样你的代码可以正常提交到Git,同步到生产环境,完全不用担心vendor目录被忽略的问题。
如果是Laravel 8及以上版本,这个逻辑依然适用,核心思路就是继承默认类并替换容器绑定。
内容的提问来源于stack exchange,提问作者Javed
相关产品推荐
相关产品推荐

