Os administradores podem criar novas contas sem senhas?

10

Quando um administrador cria uma nova conta (admin / people / create), é solicitado que você digite uma senha para a conta. Meu cliente quer que, quando uma conta for criada no back-end, o administrador não precise digitar uma senha, mas o usuário receba uma mensagem de notificação com um link de logon único e possa definir um senha após o login usando isso. Qual é a melhor maneira de conseguir algo assim?

Pensei em talvez alterar o formulário para definir os #default_valuecampos da senha como uma senha aleatória e depois definir '#access' => FALSE, mas não tenho certeza se essa é a melhor maneira de fazer isso.

Garrett Albright
fonte

Respostas:

3

Há um módulo que faz isso.

Confira Gerar senha .

Introduz essa configuração adicional em Configuração »Pessoas» Configurações da conta :

Os usuários podem digitar uma senha no registro. Se deixado em branco, uma senha aleatória será gerada. Isso sempre se aplica quando um administrador está criando a conta.

Em seguida, ao criar a conta, deixe o campo de senha vazio, mas marque esta caixa de seleção na página "Adicionar usuário":

Notificar usuário de nova conta

O resultado dessas duas configurações é que o módulo gera uma senha aleatória quando o administrador cria uma conta e o usuário recebe um email com uma notificação sobre a conta e é solicitado a definir uma senha no link de login único incluído na notificação.

Se você quiser aprender como isso é feito, leia o código fonte.

Radical livre
fonte
2
Primeiras linhas de código deste módulo está usando hook_init()a drupal_add_css()em cada carregamento da página ... é também a duplicação do núcleo user_password(). Não passa no teste de cheiro.
Garrett Albright
Concordo, @GarrettAlbright - acha que faz sentido melhorar (e simplificar) o GenPass ou criar um novo módulo ... ou encaixá-lo em um módulo de experiência administrativa existente?
mlncn
Com que frequência o administrador precisa fazer isso? No meu caso, é algo como: a cada dois meses. Isso significa que eu posso viver com o GenPass não sendo super otimizado. Se você está fazendo isso o tempo todo, pode gastar algum tempo melhorando o GenPass ou escrevendo um módulo melhor.
Radical Free
Não lembro os detalhes, mas o IIRC acabei de adotar a abordagem mencionada no meu OP; ocultando o campo de senha e apenas definindo um usando aleatoriamente user_password(mt_rand(10, 50))ou algo assim após o envio do formulário.
Garrett Albright
@FreeRadical se ele está adicionando CSS a cada carregamento da página, então certamente não importa como ofter você usar o recurso - ele vai abrandar cada página que recebe servido
Adams
3

Se você não gosta de instalar o módulo "Gerar senha" e se sente confortável usando ganchos, aqui está uma alternativa:

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

Você poderia torná-lo mais sofisticado ao seu gosto. Como está, ele sempre oculta o campo da senha e fornece um valor - o administrador precisará editar a nova conta para definir um valor específico. Também deixa desativado o padrão "notificar", enquanto você pode preferir.

Atualizado de acordo com a resposta @joe_flash (mas de uma forma um pouco mais compacta): o campo da senha será expandido em dois subcampos ("pass1" e "pass2") quando o elemento for processado.

AdamS
fonte
1

A resposta do AdamS está quase lá. Como o campo da senha será expandido em dois subcampos ("pass1" e "pass2") quando o elemento for processado ( form_process_password_confirm()), você precisará de algo como:

/**
 * 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
fonte
Obrigado, atualizei minha resposta (e lhe dei crédito!). Acontece que eu já tinha o código de trabalho no meu servidor, mas devo ter copiado acidentalmente uma versão mais antiga da resposta, desculpe.
AdamS