web-dev-qa-db-fra.com

Comment puis-je importer un mot de passe simple qui n'est pas chiffré lors d'une migration d'utilisateur?

Je suis en mesure de migrer toutes les données du compte des utilisateurs, y compris le mot de passe, mais cela ne fonctionne pas en raison du chiffrement et du hachage dans drupal 8.

Mon mot de passe n'est pas MD5. Ils ne sont pas cryptés, dans le fichier csv, ils sont comme du texte brut normal.

J'ai vu ici: https://www.drupal.org/docs/8/api/migrate-api/migrate-destination-entityuser

Si les mots de passe entrants ne sont pas clairs ou ne sont pas hachés MD5, vous devrez gérer cela dans votre migration

Mon mot de passe est simple, donc je suppose que cela devrait fonctionner.

Voici ce que j'ai essayé mais le mot de passe est importé mais non crypté:

destination:
  plugin: 'entity:user'
  plaintext_passwords: true

Dans la documentation, il est expliqué comment importer un mot de passe MD5 mais pas un mot de passe ordinaire.

Que dois-je utiliser pour la configuration?


MODIFIER:

J'ai essayé ceci:

pass:
    -
      plugin: callback
      callable: 'Drupal\Core\Password\PhpassHashedPassword::hash'
      source: passwebservice

Et

pass:
    -
      plugin: callback
      callable:
        - 'Drupal\Core\Password\PhpassHashedPassword'
        - hash
      source: passwebservice

Erreur :

Erreur: utilisation de $ this en dehors du contexte de l'objet dans Drupal\Core\Password\PhpassHashedPassword :: hash () [erreur] (ligne 215 de Core/Password/PhpassHashedPassword.php) 0 [fonction interne]: Drupal\Core\Password\PhpassHashedPassword :: hash ('9BQmM1') 1 core/modules/migrate/src/Plugin/migrate/process/Callback.php (54): call_user_func ('Drupal\Core\Pas ...', '9BQmM1')

Quand je vérifie le hachage ()

public function hash($password) {
    return $this->crypt('sha512', $password, $this->generateSalt());
  }

Je ne peux pas invoquer la méthode de cette façon ($this n'existe pas dans le contexte de la classe) alors comment faire? Est-ce possible dans le fichier de configuration?

4

Vous pouvez utiliser le code d'Ivan Jaros de deux manières:

Comme vous l'avez dit, prétraitez vos mots de passe pour les convertir en hachages. Cela peut être fait via un script Drush qui peut être exécuté à partir de la ligne de commande. Les scripts Drush ne sont que des extraits de code PhP qui s'exécutent dans le contexte Drupal. Exécutés par la commande:

drush @ site-alias scr [chemin vers l'extrait php]

L'alternative consiste à remplacer votre classe source CVS et à utiliser la méthode preparerow pour hacher le mot de passe.

  /**
   * {@inheritdoc}
   */
  public function prepareRow(Row $row) {
    $password = $row->getSourceProperty('password');
    $hash = \Drupal::service('password')->hash($password);
    $row->setSourceProperty('password', $hash);
  }

Comme indiqué dans les commentaires, vous pouvez également utiliser un plug-in de processus pour ce faire. Le plug-in de rappel utilise uniquement des classes statiques et AFIAK, la méthode de hachage nécessite l'accès aux informations de contexte qui ne sont pas disponibles via les méthodes statiques.

Voici un code rapide non testé pour créer votre propre plug-in de processus pour hacher un mot de passe en texte brut.

<?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

J'ai écrit une migration personnalisée pour migrer les utilisateurs du fichier CSV. J'ai réussi à migrer l'utilisateur, mais lorsque j'ai essayé de me connecter, donnez-moi une erreur de connexion, j'ai donc vérifié mon code de migration trouvé md5_passwords: true. md5_passwords Convertit n'importe quelle chaîne en chaîne hachée avec le cryptage md5(). j'ai donc écrit mon plugin personnalisé et ajouté à mon code de migration sans md5_passwords: true.

Voici la solution étape par étape:

  1. Créez un module personnalisé et définissez-y votre fichier de plugins:

    custom_module->src->Plugins->plugins_name->process->plugin_file.php
    

    dans mon cas:

    custom_module->src->Plugins->migrate->process->HashPasswords.php
    
  2. Écrivez cet exemple de code dans votre 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. Maintenant, écrivez votre code de migration et ajoutez ce plugin personnalisé.

    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