如何在Laravel 8 Jetstream登录时将默认Bcrypt改为SHA1加密
Laravel Jetstream 适配SHA1旧密码的实现方案
不需要直接重写Auth::attempt()核心方法,通过Laravel框架自带的自定义用户提供者机制改造即可,不会破坏框架原生逻辑,适配步骤如下:
步骤1:创建自定义SHA1用户提供者
新建app/Providers/Sha1UserProvider.php文件,继承框架原生的Eloquent用户提供者,重写密码验证逻辑:
<?php namespace App\Providers; use Illuminate\Auth\EloquentUserProvider; use Illuminate\Contracts\Auth\Authenticatable as UserContract; class Sha1UserProvider extends EloquentUserProvider { /** * 验证用户登录凭证 * @param UserContract $user * @param array $credentials * @return bool */ public function validateCredentials(UserContract $user, array $credentials) { $inputPassword = $credentials['password']; // 匹配数据库存储的SHA1格式密码 return sha1($inputPassword) === $user->getAuthPassword(); } }
如果旧项目的SHA1加密有自定义加盐逻辑,直接调整上述方法内的加密规则匹配原有逻辑即可。
步骤2:注册自定义用户提供者
打开app/Providers/AuthServiceProvider.php,在boot方法中添加自定义提供者的注册逻辑:
public function boot() { $this->registerPolicies(); \Auth::provider('sha1-eloquent', function ($app, $config) { return new Sha1UserProvider($app['hash'], $config['model']); }); }
步骤3:修改认证配置
打开config/auth.php,修改用户提供者的驱动配置:
'providers' => [ 'users' => [ 'driver' => 'sha1-eloquent', // 替换原有的eloquent驱动 'model' => App\Models\User::class, ], ],
以上步骤完成后,原有Auth::attempt()方法可直接使用,无需额外修改,就能正常匹配数据库中存储的SHA1格式密码。
可选优化:自动升级密码加密规则
如果需要在用户首次登录成功后,自动将旧的SHA1密码升级为Laravel默认更安全的bcrypt哈希,可在app/Providers/JetstreamServiceProvider.php的boot方法中添加登录认证回调逻辑:
use Laravel\Fortify\Fortify; use Illuminate\Support\Facades\Hash; public function boot() { // 原有Jetstream配置保持不变 Fortify::authenticateUsing(function ($request) { $user = \App\Models\User::where('email', $request->email)->first(); if ($user && sha1($request->password) === $user->password) { // 登录成功后覆盖更新为bcrypt密码 $user->password = Hash::make($request->password); $user->save(); return $user; } return null; }); }
内容的提问来源于stack exchange,提问作者Erfan Ahmed Siam
相关产品推荐
相关产品推荐

