web-dev-qa-db-ja.com

ユーザーを移行してパスワードを保持する

Drupal 7からDrupal 8.まで)から10Kユーザーを転送しています。パスワードを保持したいのです。

  • Drupal 7からのユーザーレコードをCSVファイルとしてダンプする
  • MySQLからハッシュされたパスワードをCSVファイルとしてダンプする
  • ユーザーレコードとハッシュされたパスワードをカスタムプログラムに読み込む
  • プログラムで、ハッシュされたパスワードを正しいユーザーレコードに追加します(UIDで一致)
  • ユーザーレコードの操作(重複の統合、フィールドの結合など)
  • 修正されたユーザーレコード(パスワードハッシュを含む)をCSVファイルに出力する
  • このCSVファイルをカスタムDrupal 8モジュールへの入力として使用してユーザーを作成します

Drupal 8にDrupal 7パスワードでユーザーを作成することを除いて、これはすべて簡単です。

私は簡単に試しました

$values = array
[
  'name' => 'test',
  'mail' => '[email protected]',
  'roles' => [],
  'pass' => $hashed_drupal_7_password,
  'status' => 1,
];
$account = entity_create('user', $values);
$account->save();

しかし、もちろんDrupal 8は、pass値がテキストパスワードであると想定し、それを再ハッシュします。

作成中または作成後に、ハッシュ済みのパスワードをユーザーアカウントに取り込む方法はありますか?私がそれらを入れても、彼らはまだ働きますか?読んでわかるように、私はパスワードや暗号化などに関しては初心者です。私は多くの投稿や記事を読みましたが、この質問に対する答えを認識していません。

4

@No Sssweatが推奨するように、 D8 Migrate Modules が良い方法です。あなたのやり方では、フィールドパスのためにプロパティpre_hashedを追加する必要があります。

$values = [
  'name' => 'test',
  'mail' => '[email protected]',
  'roles' => [],
  'pass' => [
    'value' => $hashed_drupal_7_password,
    'pre_hashed' => TRUE,
  ],
  'status' => 1,
];
$account = entity_create('user', $values);
$account->save();

このプロパティは FieldType Password にあります。

7
MrD

現在のコードがBatch APIを使用している場合を除き、特に10Kユーザーを転送する場合は、 D8移行モジュール を使用してこれを行う必要があります。そうしないと、タイムアウトが大きすぎるためにタイムアウトが発生します。また、これらの移行モジュールを使用すると、SQLからSQLに転送できます。必要ない場合は、CSVファイルは必要ありません。ただし、必要に応じて、CSVファイルをインポートできます。


私の知る限り、プログラムで質問に答えるために、Drupal APIは、おそらくセキュリティ上の理由から、ハッシュをスキップする方法を提供していません。

D7とD8は同じハッシュを使用するため、ユーザーが作成された後、手動/直接更新して上書きする必要があります。これを$account->save();の直後に追加します。

// Updates user password
$uid = $account->id();
$query = \Drupal::database()->update('users_fields_data');
$query->fields([
  'pass' => $hashed_drupal_7_password,
]);
$query->condition('uid', $uid);
$query->execute();

後でキャッシュをフラッシュします。

注:D6は異なるハッシュを使用するため、この場合、この回答は機能しません。

6
No Sssweat