Drupal 7からDrupal 8.まで)から10Kユーザーを転送しています。パスワードを保持したいのです。
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
値がテキストパスワードであると想定し、それを再ハッシュします。
作成中または作成後に、ハッシュ済みのパスワードをユーザーアカウントに取り込む方法はありますか?私がそれらを入れても、彼らはまだ働きますか?読んでわかるように、私はパスワードや暗号化などに関しては初心者です。私は多くの投稿や記事を読みましたが、この質問に対する答えを認識していません。
@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 にあります。
現在のコードが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は異なるハッシュを使用するため、この場合、この回答は機能しません。