如何解密Drupal存储密码至WordPress库?同步改密至WordPress库实现方案
嘿,我来帮你搞定这两个Drupal和WordPress密码同步的问题,分两部分说清楚:
一、如何将Drupal存储的密码同步到WordPress数据库?
首先得明确一个关键:Drupal里的用户密码是单向哈希加密的,根本没法直接解密。Drupal从7版本开始就用加盐的强哈希算法(比如bcrypt),早期WordPress用MD5,现在WP也支持bcrypt了,但两者的哈希格式不通用。所以靠谱的方案有两个:
方案1:引导用户重置密码(推荐)
直接把Drupal用户的用户名、邮箱导入WordPress,然后给每个用户发密码重置邮件。这是最安全、最省心的方式,完全避免哈希兼容的问题,还能让用户自己设置新密码。方案2:让WordPress兼容Drupal的哈希格式
如果必须保留用户现有密码,就得修改WP的密码验证逻辑,让它能识别Drupal的哈希。但这个方法需要定制WP核心或者开发插件,维护成本高,风险也大,除非特殊情况,不建议用。
二、Drupal修改密码后同步到WordPress数据库
你已经用hook_form_alter定位到用户表单了,但原代码里的exit会打断表单提交流程,而且没做实际的同步操作。下面是修改后的完整代码,添加了表单提交处理,能在用户修改密码后自动同步到WP:
/** * Implements hook_form_alter(). */ function YOUR_MODULE_NAME_form_alter(&$form, &$form_state, $form_id) { // 匹配用户编辑表单和密码重置表单 if ($form_id == 'user_profile_form' || $form_id == 'user_pass_reset') { // 添加自定义提交处理函数,在默认提交逻辑之后执行 $form['#submit'][] = 'custom_sync_password_to_wp'; } } /** * 自定义提交处理:同步Drupal密码到WordPress数据库 */ function custom_sync_password_to_wp($form, &$form_state) { $drupal_user = $form_state['user']; $new_password = $form_state['values']['pass']; // 跳过空密码的情况(用户没修改密码时不执行同步) if (empty($new_password)) { return; } // -------------------------- // 替换成你的WordPress数据库信息 $wp_db_config = [ 'host' => 'localhost', 'dbname' => 'your_wordpress_db', 'user' => 'wp_db_username', 'pass' => 'wp_db_password', ]; // -------------------------- // 连接WordPress数据库 $wp_db = mysqli_connect( $wp_db_config['host'], $wp_db_config['user'], $wp_db_config['pass'], $wp_db_config['dbname'] ); if (!$wp_db) { // 用Drupal的日志功能记录连接失败信息(生产环境用这个,别直接输出) watchdog('password_sync', 'WP数据库连接失败: @error', ['@error' => mysqli_connect_error()], WATCHDOG_ERROR); return; } // 用WordPress官方推荐的哈希函数生成密码(需要引入WP的pluggable.php) // 替换成你的WordPress安装路径 require_once '/var/www/wordpress/wp-includes/pluggable.php'; $wp_hashed_password = wp_hash_password($new_password); // 这里假设Drupal和WP用户用邮箱匹配,如果是ID匹配就改WHERE条件为 WHERE ID = {$drupal_user->uid} $safe_email = mysqli_real_escape_string($wp_db, $drupal_user->mail); $update_query = "UPDATE wp_users SET user_pass = '$wp_hashed_password' WHERE user_email = '$safe_email'"; // 执行更新并记录日志 if (mysqli_query($wp_db, $update_query)) { watchdog('password_sync', '密码同步成功,用户邮箱: @email', ['@email' => $drupal_user->mail], WATCHDOG_INFO); } else { watchdog('password_sync', '密码同步失败: @error', ['@error' => mysqli_error($wp_db)], WATCHDOG_ERROR); } // 关闭数据库连接 mysqli_close($wp_db); }
几个重要的注意事项:
- 把
YOUR_MODULE_NAME替换成你实际的Drupal自定义模块名称,代码要放到模块的.module文件里 - 确保Drupal服务器能访问WordPress的数据库:开放数据库端口、给WP数据库用户授权远程访问权限
- 生产环境绝对不要用
print_r和exit,用Drupal的watchdog记录日志才安全 - 如果你的WordPress版本比较老,
wp_hash_password可能需要额外处理,但现在大部分WP版本都支持这个函数 - 要保证Drupal和WP的用户标识一致(比如邮箱、ID),不然会同步错用户
内容的提问来源于stack exchange,提问作者gopi
相关产品推荐
相关产品推荐

