web-dev-qa-db-ja.com

ユーザーの移行中に暗号化されていないプレーンパスワードをインポートするにはどうすればよいですか?

パスワードを含むユーザーアカウントのすべてのデータを移行できますが、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はクラスコンテキストに存在しません)。どうすればよいですか。構成ファイルで可能ですか?

4

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;
  }

}
4
CG Monroe

CSVファイルからユーザーを移行するカスタム移行を作成しました。ユーザーを正常に移行しましたが、ログインしようとしたときにログインエラーが発生したため、移行コードで_md5_passwords: true_が見つかったことを確認しました。 _md5_passwords_ md5()暗号化を使用して、任意の文字列をハッシュされた文字列に変換します。カスタムプラグインを作成し、_md5_passwords: true_なしで移行コードに追加しました。

これが段階的な解決策です:

  1. カスタムモジュールを作成し、その中にプラグインファイルを定義します。

    _custom_module->src->Plugins->plugins_name->process->plugin_file.php
    _

    私の場合:

    _custom_module->src->Plugins->migrate->process->HashPasswords.php
    _
  2. 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;
      }
    } ?>`
    _
  3. 次に、移行コードを記述して、このカスタムプラグインを追加します。

    _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: {  }
    _
0
Manav