Czy administratorzy mogą tworzyć nowe konta bez haseł?

10

Gdy administrator utworzy nowe konto (admin / people / create), zostanie poproszony o podanie hasła do konta. Mój klient chce, aby podczas tworzenia konta w zapleczu administrator nie musiał wprowadzać hasła, ale użytkownik otrzymuje wiadomość z jednorazowym łączem do logowania, a następnie może ustawić hasło po zalogowaniu przy użyciu tego. Jaki jest najlepszy sposób na osiągnięcie czegoś takiego?

Myślałem o zmianie formularza, aby ustawić #default_valuepola hasła na losowe hasło, a następnie ustawić '#access' => FALSE, ale nie jestem pewien, czy to najlepszy sposób, aby to zrobić.

Garrett Albright
źródło

Odpowiedzi:

3

Istnieje moduł, który to robi.

Sprawdź Wygeneruj hasło .

Wprowadza to dodatkowe ustawienie w Konfiguracja »Ludzie» Ustawienia konta :

Użytkownicy mogą wprowadzić hasło przy rejestracji. Jeśli pozostanie puste, zostanie wygenerowane losowe hasło. Ma to zawsze zastosowanie, gdy administrator tworzy konto.

Następnie podczas tworzenia konta pozostaw pole hasła puste, ale upewnij się, że zaznaczyłeś również to pole wyboru na stronie „Dodaj użytkownika”:

Powiadom użytkownika o nowym koncie

W wyniku tych dwóch ustawień moduł generuje losowe hasło, gdy administrator tworzy konto, a użytkownik otrzymuje wiadomość e-mail z powiadomieniem o koncie i monituje o ustawienie hasła w dołączonym jednorazowym łączu logowania w powiadomieniu.

Jeśli chcesz dowiedzieć się, jak to zrobić, przeczytaj kod źródłowy.

Darmowe radykalne
źródło
2
Pierwsze wiersze kodu tego modułu używają hook_init()do drupal_add_css()każdego ładowania strony… jest to także powielanie rdzeni user_password(). Nie przechodzi testu zapachu.
Garrett Albright,
Zgadzam się, @GarrettAlbright - czy uważasz, że sensowne jest ulepszenie (i uproszczenie) GenPass lub stworzenie nowego modułu ... lub zmieścić go w istniejącym module administracyjnym?
mlncn
Jak często administrator musi to robić? W moim przypadku jest to coś w stylu: co drugi miesiąc. Oznacza to, że mogę żyć z GenPass bez superoptymalizacji. Jeśli robisz to cały czas, możesz poświęcić trochę czasu na ulepszanie GenPass lub pisanie lepszego modułu.
Wolne radykalne
Nie pamiętam szczegółów, ale IIRC właśnie wybrałem podejście, o którym wspomniałem w OP; ukrywanie pola hasła i ustawienie go losowo przy użyciu user_password(mt_rand(10, 50))formularza lub czegoś podobnego po przesłaniu formularza.
Garrett Albright,
@FreeRadical, jeśli dodaje CSS do każdego ładowania strony, to na pewno nie ma znaczenia, jak często korzystasz z tej funkcji - spowolni każdą wyświetlaną stronę
AdamS
3

Jeśli nie masz ochoty instalować modułu „Generuj hasło” i nie przeszkadza ci używanie haków, oto alternatywa:

/**
 * 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'];
  }
}

Możesz uczynić go bardziej wyrafinowanym według własnego gustu. W obecnej formie zawsze ukrywa pole hasła i podaje wartość - administrator będzie musiał edytować nowe konto, aby ustawić określoną wartość. Poza tym domyślnie „powiadomienie” jest wyłączone, podczas gdy możesz preferować włączenie.

Zaktualizowano zgodnie z odpowiedzią @joe_flash (ale w nieco bardziej zwartej formie): pole hasła zostanie rozszerzone do dwóch podpól („pass1” i „pass2”) podczas przetwarzania elementu.

AdamS
źródło
1

Odpowiedź AdamS jest już prawie na miejscu. Ponieważ pole hasła zostanie rozszerzone na dwa podpola („pass1” i „pass2”) podczas przetwarzania elementu ( form_process_password_confirm()), potrzebujesz czegoś takiego:

/**
 * 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
źródło
Dzięki, zaktualizowałem swoją odpowiedź (i dziękuję!). Okazuje się, że miałem już działający kod na moim serwerze, ale musiałem przypadkowo skopiować starszą wersję do odpowiedzi, przepraszam.
AdamS,