パスワードを含むユーザーアカウントのすべてのデータを移行できますが、drupal 8.の暗号化とハッシュのために機能しません。
私のパスワードはMD5ではありません。それらは暗号化されていません、csvファイルでは通常のプレーンテキストのようです。
私はここで見ました: https://www.drupal.org/docs/8/api/migrate-api/migrate-destination-entityuser
受信パスワードがプレーンでないか、MD5ハッシュ化されていない場合は、移行でこれに対処する必要があります
私のパスワードは単純なので、うまくいくと思います。
これが私が試したものですが、パスワードはインポートされますが暗号化されません:
destination:
plugin: 'entity:user'
plaintext_passwords: true
ドキュメントでは、プレーンパスワードではなくMD5パスワードをインポートする方法が説明されています。
構成には何を使用すればよいですか?
EDIT:
私はこれを試しました:
pass:
-
plugin: callback
callable: 'Drupal\Core\Password\PhpassHashedPassword::hash'
source: passwebservice
そして
pass:
-
plugin: callback
callable:
- 'Drupal\Core\Password\PhpassHashedPassword'
- hash
source: passwebservice
エラー:
エラー:Drupal\Core\Password\PhpassHashedPassword :: hash()のオブジェクトコンテキストにない場合の$ thisの使用[エラー](Core/Password/PhpassHashedPassword.phpの215行目)0 [内部関数]:Drupal\Core\Password\PhpassHashedPassword :: hash( '9BQmM1')1コア/モジュール/migrate/src/Plugin/migrate/process/Callback.php(54):call_user_func( 'Drupal\Core\Pas ...'、 '9BQmM1')
Hash()をチェックするとき
public function hash($password) {
return $this->crypt('sha512', $password, $this->generateSalt());
}
この方法でメソッドを呼び出すことはできません($this
はクラスコンテキストに存在しません)。どうすればよいですか。構成ファイルで可能ですか?
Ivan Jarosのコードは2つの方法で使用できます。
あなたが言ったように、それらをハッシュに変換するためにパスワードを前処理します。これは、コマンドラインから実行できるDrushスクリプトを介して実行できます。 Drushスクリプトは、Drupalコンテキストで実行されるPhPコードのスニペットです。次のコマンドで実行します。
drush @ site-alias scr [phpスニペットへのパス]
別の方法は、CVS Sourceクラスをオーバーライドし、preparerowメソッドを使用してパスワードをハッシュすることです。
/**
* {@inheritdoc}
*/
public function prepareRow(Row $row) {
$password = $row->getSourceProperty('password');
$hash = \Drupal::service('password')->hash($password);
$row->setSourceProperty('password', $hash);
}
コメントで指摘されているように、プロセスプラグインを使用してこれを行うこともできます。コールバックプラグインは静的クラスのみを使用し、AFIAKハッシュメソッドは静的メソッドでは利用できないコンテキスト情報へのアクセスを必要とします。
プレーンテキストのパスワードをハッシュする独自のプロセスプラグインを作成するための、テストされていない簡単なコードを次に示します。
<?php
namespace Drupal\my_mode\Plugin\migrate\process;
use Drupal\migrate\MigrateExecutableInterface;
use Drupal\migrate\ProcessPluginBase;
use Drupal\migrate\Row;
/**
* Converts a plain password to an hash.
*
* Example:
*
* @code
* process:
* password:
* plugin: my_module_hash_password
* source: field_password
* @endcode
*
* @see \Drupal\migrate\Plugin\MigrateProcessInterface
*
* @MigrateProcessPlugin(
* id = "my_module_hash_password"
* )
*/
class HashPassword extends ProcessPluginBase {
/**
* {@inheritdoc}
*/
public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
$hash = \Drupal::service('password')->hash($value);
return $hash;
}
}
CSVファイルからユーザーを移行するカスタム移行を作成しました。ユーザーを正常に移行しましたが、ログインしようとしたときにログインエラーが発生したため、移行コードで_md5_passwords: true
_が見つかったことを確認しました。 _md5_passwords
_ md5()
暗号化を使用して、任意の文字列をハッシュされた文字列に変換します。カスタムプラグインを作成し、_md5_passwords: true
_なしで移行コードに追加しました。
これが段階的な解決策です:
カスタムモジュールを作成し、その中にプラグインファイルを定義します。
_custom_module->src->Plugins->plugins_name->process->plugin_file.php
_
私の場合:
_custom_module->src->Plugins->migrate->process->HashPasswords.php
_
Plugin_file.phpにこのサンプルコードを記述します
_<?php
namespace Drupal\custom_module\Plugin\migrate\process;
use Drupal\Core\Password\PhpassHashedPassword;
use Drupal\migrate\MigrateExecutableInterface;
use Drupal\migrate\ProcessPluginBase;
use Drupal\migrate\Row;
/**
* Converts a plain password to an hash.
*
* Example:
*
* @code
* process:
* password:
* plugin: hashpasswords
* source: password
* @endcode
*
* @see \Drupal\migrate\Plugin\MigrateProcessInterface
*
* @MigrateProcessPlugin(
* id = "hashpasswords"
* )
*/
class HashPasswords extends ProcessPluginBase {
/**
* {@inheritdoc}
*/
public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
$passwordHasher = new PhpassHashedPassword(1);
$hashedPassword = $passwordHasher->hash($value);
return $hashedPassword;
}
} ?>`
_
次に、移行コードを記述して、このカスタムプラグインを追加します。
_id: ROF_user
label: 'Migrate ROF User from CSV'
source:
plugin: csv
path: modules/custom/custom_module/csv/user.csv
header_row_count: 1
keys:
- ID
process:
uid: ID
name: name
field_first_name: firstname
field_last_name: lastname
mail: email
pass:
plugin: hashpasswords
source: password
roles:
plugin: explode
delimiter: ','
source: roles
status: status
destination:
plugin: 'entity:user'
migration_dependencies:
required: { }
optional: { }
_