使用Laravel 5.2的内置身份验证将旧的md5密码迁移到bcrypt

Jos*_*eph 4 laravel laravel-5

我正在将一个旧的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)为用户生成新的密码,然后保存.