Могут ли администраторы создавать новые учетные записи без паролей?


10

Когда администратор создает новую учетную запись (admin / people / create), ему предлагается ввести пароль для учетной записи. Мой клиент хочет, чтобы при создании учетной записи в бэкэнде администратору не нужно было вводить пароль, но пользователю было отправлено уведомление с одноразовой ссылкой для входа в систему, а затем он мог установить пароль после входа в систему с помощью этого. Какой лучший способ добиться чего-то подобного?

Я подумал о том, чтобы изменить форму, чтобы установить #default_valueдля полей пароля случайный пароль, а затем установить '#access' => FALSE, но я не уверен, что это лучший способ сделать это.

Ответы:


3

Есть модуль, который делает это.

Проверьте Сгенерировать пароль .

Этот дополнительный параметр вводится в разделе «Конфигурация» Люди »Настройки учетной записи :

Пользователи могут ввести пароль при регистрации. Если оставить пустым, будет сгенерирован случайный пароль. Это всегда применяется, когда администратор создает учетную запись.

Затем при создании учетной записи оставьте поле пароля пустым, но не забудьте также установить этот флажок на странице «Добавить пользователя»:

Уведомить пользователя о новой учетной записи

Результатом этих двух настроек является то, что модуль генерирует случайный пароль, когда администратор создает учетную запись, и пользователю отправляется электронное письмо с уведомлением об учетной записи и предлагается установить пароль в включенной ссылке для одноразового входа. в уведомлении.

Если вы хотите узнать, как это делается, прочитайте исходный код.


2
Первые строки кода этого модуля используют hook_init()для drupal_add_css()каждой загрузки страницы ... это также дублирует ядро user_password(). Не проходит тест на запах.
Гаррет Олбрайт

Согласитесь, @GarrettAlbright - думаете, что имеет смысл улучшить (и упростить) GenPass или создать новый модуль ... или вписать его в существующий модуль администрирования?
млн. В

Как часто администратор должен это делать? В моем случае это что-то вроде: через месяц. Это означает, что я могу жить с GenPass, не будучи сверхоптимизированным. Если вы делаете это все время, вы можете потратить некоторое время на улучшение GenPass или на создание лучшего модуля.
Свободный радикальный

Я не могу вспомнить подробности, но IIRC Я просто использовал подход, который я упоминал в своем ОП; скрыть поле пароля и просто установить его случайным образом user_password(mt_rand(10, 50))или что-то подобное при отправке формы.
Гаррет Олбрайт

@FreeRadical, если он добавляет CSS к каждой загрузке страницы, тогда, разумеется, не имеет значения, как часто вы используете эту функцию - она ​​будет замедлять работу каждой отдельной страницы
AdamS

3

Если вам не нравится установка модуля «Generate Password», и вам удобно использовать хуки, то есть альтернатива:

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

Вы можете сделать его более изысканным на ваш вкус. В существующем состоянии оно всегда скрывает поле пароля и вместо него предоставляет значение - администратору придется отредактировать новую учетную запись, чтобы установить конкретное значение. Также он оставляет значение по умолчанию "notify" выключенным, тогда как вы можете предпочесть on.

Обновлен согласно ответу @joe_flash (но в несколько более компактной форме): поле пароля будет расширено до двух подполей ("pass1" и "pass2") при обработке элемента.


1

Ответ AdamS почти там. Поскольку поле пароля будет расширено до двух подполей («pass1» и «pass2») при обработке элемента ( form_process_password_confirm()), вам нужно что-то вроде:

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

Спасибо, я обновил свой ответ (и дал вам кредит!). Оказывается, у меня уже был рабочий код на моем сервере, но я, должно быть, случайно скопировал более старую версию в ответ, извините.
Адамс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.