gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:35:42 29 4
gpt4 key购买 nike

我正在将旧的 PHP 应用程序迁移到 Laravel 5.2。该应用程序有一个巨大的用户表(大约 50K 用户),密码都是 MD5 哈希值。

显然这是 Not Acceptable ,但我不想向所有 50,000 个用户发送电子邮件要求他们重置密码,而是想在幕后将密码更改为 bcrypt 哈希值。

为此,我想创建一个包含 MD5 哈希值的 old_password 列,然后每当用户登录时,我都会根据 MD5 哈希值(如果存在)检查密码,然后为下次创建一个新的 bcrypt 哈希值,删除 MD5 哈希值。

我已经看到了一些关于如何执行此操作的示例(例如 thisthis ),但没有一个专门针对 Laravel 5,也没有一个专门用于 Laravel 5.2 的内置身份验证。

是否有一种干净的方法来调整内置身份验证来执行此操作,或者在这种情况下我最好编写自己的手动身份验证系统吗?

最佳答案

从 Drupal 迁移时我遇到了类似的问题。我没有为旧密码创建一个新列,而是更新了哈希器来检查密码 Drupal-way,然后如果失败,请使用 bcrypt 检查它。这样老用户就可以像新用户一样登录。

您需要在应用程序中的任何位置创建一个包,例如在 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'];
}

}

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$';
}
}

然后将 App\Packages\Hashing\YourHashingServiceProvider::class 放入 config/app.class 的 providers 中。此时,您的老用户应该能够登录您的 laravel 应用程序。

现在,要更新他们的密码,您可以在用户 Controller (登录/注册表单)中的某个位置使用 Hash::needsRehash($hashed)Hash::make($password_value ) 为用户生成新的 bcrypt 密码,然后保存它。

关于laravel - 使用 Laravel 5.2 的内置身份验证将旧的 md5 密码迁移到 bcrypt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36061314/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com