管理员可以创建没有密码的新帐户吗?


10

管理员创建新帐户(admin / people / create)时,系统会提示他们输入该帐户的密码。我的客户希望这样的情况是,在后端创建帐户时,管理员不必输入密码,但是会向用户发送一条带有一次性登录链接的通知消息,然后可以设置使用该密码登录后输入密码。实现这样的最佳方法是什么?

我曾想过可能会更改表单以将#default_value密码字段的值设置为随机密码,然后再设置'#access' => FALSE,但是我不确定这是否是最好的方法。

Answers:


3

有一个模块可以做到这一点。

签出生成密码

它在配置»人员»帐户设置中引入了此附加设置

用户可以在注册时输入密码。如果保留为空,将生成一个随机密码。这通常在管理员创建帐户时适用。

然后,在创建帐户时,将密码字段保留为空,但请确保还选中“添加用户”页面上的此复选框:

通知用户新帐户

这两个设置的结果是,当管理员创建帐户时,模块会生成一个随机密码,并且会向用户发送一封电子邮件,其中包含有关该帐户的通知,并提示用户在包含的一次性登录链接中设置密码在通知中。

如果您想学习如何做,请阅读源代码。


2
该模块的代码第一线使用hook_init(),以drupal_add_css()在每个页面加载...它也复制核心的user_password()。没有通过气味测试。
Garrett Albright 2014年

同意,@ GarrettAlbright-认为有必要改进(简化)GenPass或制作一个新模块……还是将其放入现有的管理员体验模块中?
mlncn 2014年

管理员必须多久执行一次此操作?就我而言,它就像:每隔一个月。这意味着我可以不对GenPass进行超级优化。如果您一直在这样做,则可能需要花费一些时间来改进GenPass或编写更好的模块。
自由基2014年

我不记得具体情况,但是IIRC只是采用了我在OP中提到的方法;隐藏密码字段,user_password(mt_rand(10, 50))然后在提交表单时随机使用或类似设置。
Garrett Albright 2014年

@FreeRadical如果要在每个页面加载中添加CSS,那么确定使用该功能的大小无关紧要-它会减慢每一个提供的页面的速度
AdamS 2015年

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”默认值设置为off,而您可能更喜欢选择on。

按照@joe_flash答案进行更新(但形式略紧凑):处理元素时,密码字段将扩展为两个子字段(“ pass1”和“ pass2”)。


1

AdamS的答案几乎在那里。由于在处理元素(form_process_password_confirm())时,密码字段将扩展为两个子字段(“ pass1”和“ pass2” ),因此您需要执行以下操作:

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

谢谢,我已经更新了我的答案(并给了你信用!)。事实证明,我的服务器上已经有工作代码,但很可能不小心将较旧的版本复制到了答案中。
亚当斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.