我正在将一个旧的PHP应用程序迁移到Laravel 5.2.该应用程序有一个巨大的用户表(约50K用户),密码都是MD5哈希.
显然这是不可接受的,而不是向所有50,000名用户发送电子邮件,要求他们重置密码,我想在后台将密码更改为bcrypt哈希.
为此,我想在其中创建一个old_password包含MD5哈希的列,然后每当用户登录时,我会根据MD5哈希(如果存在)检查密码,然后为下次创建一个新的bcrypt哈希,删除MD5哈希.
我已经看到了一些关于如何做到这一点的例子(比如这个和这个),但没有一个专门用于Laravel 5,也没有专门用于Laravel 5.2内置的auth.
有没有一种干净的方法来调整内置的auth来做到这一点,或者我最好在这种情况下编写自己的手动auth系统?
小智 6
从Drupal迁移时我遇到了类似的问题.我没有为旧密码创建一个新列,但更新了hasher以检查密码Drupal-way然后如果失败,请使用bcrypt进行检查.这样老用户可以以与新用户相同的方式登录.
您需要在app中的任何位置创建一个包,比如app/packages/hashing.把这两个文件放在那里.
YourHashingServiceProvider.php
<?php namespace App\Packages\Hashing;
use Illuminate\Support\ServiceProvider;
class YourHashingServiceProvider extends ServiceProvider {
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = true;
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->singleton('hash', function() { return new YourHasher; });
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return ['hash'];
}
}
Run Code Online (Sandbox Code Playgroud)
YourHasher.php
<?php namespace App\Packages\Hashing;
use Illuminate\Contracts\Hashing\Hasher as HasherContract;
use Illuminate\Hashing\BcryptHasher;
use Auth;
class YourHasher implements HasherContract
{
protected $hasher;
/**
* Create a new Sha512 hasher instance.
*/
public function __construct()
{
$this->hasher = new BcryptHasher;
}
/**
* Hash the given value.
*
* @param string $value
* @param array $options
*
* @return string
*/
public function make($value, array $options = [])
{
return $this->hasher->make($value, $options);
}
/**
* Check the given plain value against a hash.
*
* @param string $value
* @param string $hashedValue
* @param array $options
*
* @return bool
*/
public function check($value, $hashedValue, array $options = [])
{
return md5($value) == $hashedValue || $this->hasher->check($value, $hashedValue, $options);
}
/**
* Check if the given hash has been hashed using the given options.
*
* @param string $hashedValue
* @param array $options
*
* @return bool
*/
public function needsRehash($hashedValue, array $options = [])
{
return substr($hashedValue, 0, 4) != '$2y$';
}
}
Run Code Online (Sandbox Code Playgroud)
然后把App\Packages\Hashing\YourHashingServiceProvider::class里面providers在你的config/app.class.此时,您的旧用户应该能够登录您的laravel应用程序.
现在,要在用户控制器(登录/注册表单)的某处更新密码,您可以使用Hash::needsRehash($hashed)并Hash::make($password_value)为用户生成新的密码,然后保存.