Les administrateurs peuvent-ils créer de nouveaux comptes sans mot de passe?

10

Lorsqu'un administrateur crée un nouveau compte (admin / people / create), il est invité à entrer un mot de passe pour le compte. Mon client souhaite que lorsqu'un compte est créé à l'arrière-plan, l'administrateur n'ait pas à saisir de mot de passe, mais l'utilisateur reçoit un message de notification avec un lien de connexion unique et peut ensuite définir un mot de passe après avoir ouvert une session en utilisant cela. Quelle est la meilleure façon de réaliser quelque chose comme ça?

J'ai pensé à peut-être modifier le formulaire pour définir les #default_valuechamps de mot de passe sur un mot de passe aléatoire, puis définir '#access' => FALSE, mais je ne sais pas si c'est la meilleure façon de procéder.

Garrett Albright
la source

Réponses:

3

Il y a un module qui fait ça.

Consultez Générer un mot de passe .

Il introduit ce paramètre supplémentaire dans Configuration »People» Paramètres du compte :

Les utilisateurs peuvent entrer un mot de passe lors de l'inscription. S'il est laissé vide, un mot de passe aléatoire sera généré. Cela s'applique toujours lorsqu'un administrateur crée le compte.

Ensuite, lors de la création du compte, laissez le champ de mot de passe vide, mais assurez-vous également de cocher cette case sur la page "Ajouter un utilisateur":

Informer l'utilisateur d'un nouveau compte

Le résultat de ces deux paramètres est que le module génère un mot de passe aléatoire lorsque l'administrateur crée un compte et que l'utilisateur reçoit un e-mail avec une notification sur le compte et est invité à définir un mot de passe dans le lien de connexion unique inclus. dans la notification.

Si vous voulez savoir comment cela se fait, lisez le code source.

Radical gratuit
la source
2
Les premières lignes de code de ce module utilisent hook_init()à drupal_add_css()chaque chargement de page… c'est aussi la duplication du noyau user_password(). Ne passe pas le test olfactif.
Garrett Albright
D'accord, @GarrettAlbright - pensez-vous qu'il est logique d'améliorer (et de simplifier) ​​GenPass ou de créer un nouveau module ... ou de l'intégrer dans un module d'expérience d'administration existant?
mlncn
À quelle fréquence l'administrateur doit-il effectuer cette opération? Dans mon cas, c'est quelque chose comme: Tous les deux mois. Cela signifie que je peux vivre avec GenPass sans être super-optimisé. Si vous faites cela tout le temps, vous voudrez peut-être passer du temps à améliorer GenPass ou à écrire un meilleur module.
Radical gratuit du
Je ne me souviens pas des détails, mais l'IIRC je viens de suivre l'approche que je mentionne dans mon PO; masquer le champ du mot de passe et en définir un au hasard en utilisant user_password(mt_rand(10, 50))ou quelque chose comme ça lors de la soumission du formulaire.
Garrett Albright du
@FreeRadical s'il ajoute du CSS à chaque chargement de page, alors peu importe combien de fois vous utilisez la fonctionnalité - cela ralentira chaque page qui sera servie
AdamS
3

Si vous n'avez pas envie d'installer le module "Générer un mot de passe" et que vous êtes à l'aise avec les hooks, voici une alternative:

/**
 * Implements hook_form_FORM_ID_alter().
 *
 * Remove the password field when admin is creating an account.
 */
function HOOK_form_user_register_form_alter(&$form, &$form_state, $form_id) {
  if ($form['administer_users']['#value']) {
    $form['account']['pass']['#access'] = FALSE;
    $form['account']['pass']['#value']['pass1'] = user_password();
    $form['account']['pass']['#value']['pass2'] = $form['account']['pass']['#value']['pass1'];
  }
}

Vous pourriez le rendre plus sophistiqué à votre goût. En l'état, il masque toujours le champ du mot de passe et fournit une valeur à la place - l'administrateur devra modifier le nouveau compte pour définir une valeur spécifique. En outre, il laisse la valeur par défaut "notifier" désactivée, alors que vous préférerez peut-être activée.

Mis à jour selon la réponse @joe_flash (mais sous une forme légèrement plus compacte): le champ du mot de passe sera développé en deux sous-champs ("pass1" et "pass2") lorsque l'élément est traité.

AdamS
la source
1

La réponse d'AdamS est presque là. Étant donné que le champ de mot de passe sera développé en deux sous-champs ("pass1" et "pass2") lorsque l'élément est traité ( form_process_password_confirm()), vous avez besoin de quelque chose comme:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function acfo_common_form_user_register_form_alter(&$form, &$form_state, $form_id) {
  // Do special for user admins.
  if ($form['administer_users']['#value']) {
    // Default to sending user an account creation notification.
    $form['account']['notify']['#default_value'] = 1;

    // We'll send a one-time login link in lieu of setting a password here.
    $pass = user_password();
    $form['account']['pass']['#value'] = array(
      'pass1' => $pass,
      'pass2' => $pass,
    );
    $form['account']['pass']['#access'] = FALSE;
  }
}
joe_flash
la source
Merci, j'ai mis à jour ma réponse (et je vous en remercie!). Il s'avère que j'avais déjà le code de travail sur mon serveur mais que j'ai dû accidentellement copier une ancienne version dans la réponse, désolé.
AdamS