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?
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;
}
}
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:
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
É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;
}
} ?>`
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: { }