如何将成员从另一个系统导入到WordPress并更新密码以使其正常工作?

时间:2015-07-31 作者:Tomas

我们当前的系统(不使用Wordpress)有1000个用户,我们需要将其移植到Wordpress。我们遇到的问题是密码不能保持不变。

在我们当前的系统中,密码保存为:

md5( md5( $password ) . USER_SALT ); // USER_SALT is a defined constant
显然不是最好的,但也不是最坏的。。。

我们需要使这些密码哈希,我们目前有工作在WP以及。是否有一种方法可以先通过此设置运行所有新密码,然后再通过WPs自己的哈希?

我知道您可以使用以下函数:

function my_hash_password($password){
    return md5( md5( $password ) . USER_SALT );
}
add_action(\'wp_hash_password\', \'my_hash_password\' );
出于某种原因,这也没有完全奏效。

肯定有其他人以前也经历过这种情况。

谢谢

编辑

到目前为止,还存在一些混乱。我并不是在要求不对我们的哈希密码进行哈希运算。我想说的是,在我们当前的系统中,密码看起来像:

Password:  password
Hash function: md5( md5( $password ) . USER_SALT );
Output: d372f9c033e9c358b111ff265e080d3a
我希望“也许”能够获取上面的哈希并将其提供给本机WP密码哈希器,以便:

d372f9c033e9c358b111ff265e080d3a
变成。。。

$P$BdrwxndTzgTVHUozGpQ9TEMYd6mpTw0
完成其功能后。

然后,当用户登录时,我们通过我们的函数发送他们的纯文本密码,然后通过WPs获得匹配。

使现代化

因此,根据以下rarst的建议,我已经这样做了:

function my_check_password($password, $hash, $user_id = \'\') {
    global $wp_hasher;
    if ( $hash == md5( md5( $password ) . USER_SALT ) ){
        if ( $user_id ) {
        $check = true;
        wp_set_password($password, $user_id);
        $hash = wp_hash_password($password);
      }
      return apply_filters( \'check_password\', $check, $password, $hash, $user_id );
    }

    // If the hash is still md5...
    elseif ( strlen($hash) <= 32 ) {
        $check = hash_equals( $hash, md5( $password ) );
        if ( $check && $user_id ) {
            // Rehash using new hash.
            wp_set_password($password, $user_id);
            $hash = wp_hash_password($password);
        }
        return apply_filters( \'check_password\', $check, $password, $hash, $user_id );
    }

    // If the stored hash is longer than an MD5, presume the
    // new style phpass portable hash.
    if ( empty($wp_hasher) ) {
        require_once( ABSPATH . WPINC . \'/class-phpass.php\');
        // By default, use the portable hash from phpass
        $wp_hasher = new PasswordHash(8, true);
    }

    $check = $wp_hasher->CheckPassword($password, $hash);

    /** This filter is documented in wp-includes/pluggable.php */
    return apply_filters( \'check_password\', $check, $password, $hash, $user_id );
}
add_action(\'wp_check_password\', \'my_check_password\' );
但这仍然不起作用。我错过了什么?

1 个回复
SO网友:Rarst

你没有比这更完美的解决方案了,因为这正是WordPress核心本身必须处理的。

请参阅,在早期,WP只使用了一次通过MD5作为密码。然后他们选择了更好的散列,但显然它应该继续使用旧的散列。

现在如果你看看wp_check_password(), 它所做的(用户尝试登录时)如下所示:

检查哈希是否看起来“旧”

  • 如果是,则在“旧”模式下验证它
  • 如果是,则将哈希更新为“新”模式(使用运行时此时可用的密码)
  • 否则在“新”模式下验证
  • 您只需遵循完全相同的逻辑!钩入check_password 或覆盖wp_check_password() 总之(这就是所谓的可插拔功能)。然后执行相同的检查;升级哈希的逻辑。

    结束

    相关推荐

    排除Plugins.php HTTP安装路径与单个插件的HTTPS的故障

    我正在尝试对插件中显示的安装路径进行故障排除。php作为我在自己的网站上安装的插件,我最初并没有编写该插件。当我的站点的其余部分是HTTPS时,此插件引用和安装的所有资源都会显示为混合内容HTTP。我一直在玩弄下面的代码段,但它似乎没有起到什么作用,也没有解决问题。有人能指出我遗漏了什么吗? /** * registers scripts and stylesheets */ public function register_assets() {&