Quản trị viên có thể tạo tài khoản mới mà không cần mật khẩu không?


10

Khi quản trị viên tạo tài khoản mới (quản trị viên / người / tạo), họ sẽ được nhắc nhập mật khẩu cho tài khoản. Khách hàng của tôi muốn rằng khi tài khoản được tạo ở phía sau, quản trị viên không phải nhập mật khẩu, nhưng người dùng được gửi tin nhắn thông báo với liên kết đăng nhập một lần và sau đó có thể đặt liên kết mật khẩu sau khi đăng nhập bằng cách sử dụng đó. Cách tốt nhất để đạt được một cái gì đó như thế này là gì?

Tôi đã nghĩ có thể thay đổi hình thức để đặt các #default_valuetrường mật khẩu thành mật khẩu ngẫu nhiên và sau đó cài đặt '#access' => FALSE, nhưng tôi không chắc đó có phải là cách tốt nhất để thực hiện hay không.

Câu trả lời:


3

Có một mô-đun làm điều này.

Kiểm tra Tạo mật khẩu .

Nó giới thiệu cài đặt bổ sung này trong Cấu hình »Mọi người» Cài đặt tài khoản :

Người dùng có thể nhập mật khẩu khi đăng ký. Nếu để trống, mật khẩu ngẫu nhiên sẽ được tạo. Điều này luôn áp dụng khi quản trị viên đang tạo tài khoản.

Sau đó, khi tạo tài khoản, hãy để trống trường mật khẩu, nhưng hãy đảm bảo bạn cũng kiểm tra hộp kiểm này trên trang "Thêm người dùng":

Thông báo cho người dùng tài khoản mới

Kết quả của hai cài đặt này là mô-đun tạo mật khẩu ngẫu nhiên khi quản trị viên tạo tài khoản và người dùng được gửi email có thông báo về tài khoản và được nhắc đặt mật khẩu trong liên kết đăng nhập một lần được bao gồm trong thông báo.

Nếu bạn muốn tìm hiểu làm thế nào nó được thực hiện, đọc mã nguồn.


2
Các dòng mã đầu tiên của mô-đun này đang sử dụng hook_init()để drupal_add_css()tải trên mỗi trang. Nó cũng nhân đôi lõi user_password(). Không vượt qua bài kiểm tra mùi.
Garrett Albright

Đồng ý, @GarrettAlbright - nghĩ rằng nên cải thiện (và đơn giản hóa) GenPass hoặc tạo một mô-đun mới ... hoặc điều chỉnh nó trong mô-đun trải nghiệm quản trị viên hiện có?
mlncn

Làm thế nào thường xuyên làm quản trị viên phải làm điều này? Trong trường hợp của tôi, nó là một cái gì đó như: Mỗi tháng. Điều này có nghĩa là tôi có thể sống với GenPass không được tối ưu hóa. Nếu bạn đang làm điều này mọi lúc, bạn có thể muốn dành thời gian để cải thiện GenPass hoặc viết một mô-đun tốt hơn.
Cấp tiến miễn phí

Tôi không thể nhớ lại các chi tiết cụ thể, nhưng IIRC Tôi chỉ thực hiện cách tiếp cận mà tôi đề cập trong OP của mình; ẩn trường mật khẩu và chỉ cần đặt ngẫu nhiên một cách sử dụng user_password(mt_rand(10, 50))hoặc một cái gì đó tương tự khi gửi biểu mẫu.
Garrett Albright

@FreeRadical nếu nó thêm CSS vào mỗi lần tải trang, thì chắc chắn việc bạn sử dụng tính năng này như thế nào không quan trọng - nó sẽ làm chậm mọi trang duy nhất được phục vụ
AdamS

3

Nếu bạn không thích cài đặt mô-đun "Tạo mật khẩu" và thoải mái sử dụng móc, thì đây là một cách thay thế:

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

Bạn có thể làm cho nó tinh vi hơn theo sở thích của bạn. Vì nó đứng, nó luôn ẩn trường mật khẩu và cung cấp một giá trị thay vào đó - quản trị viên sẽ phải chỉnh sửa tài khoản mới để đặt một giá trị cụ thể. Ngoài ra, nó để mặc định "thông báo" tắt, trong khi bạn có thể thích hơn.

Được cập nhật theo câu trả lời @joe_flash (nhưng ở dạng gọn hơn một chút): trường mật khẩu sẽ được mở rộng thành hai trường con ("pass1" và "pass2") khi phần tử được xử lý.


1

Câu trả lời của AdamS gần như ở đó. Vì trường mật khẩu sẽ được mở rộng thành hai trường con ("pass1" và "pass2") khi phần tử được xử lý ( form_process_password_confirm()), bạn cần một cái gì đó như:

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

Cảm ơn tôi đã cập nhật câu trả lời của tôi (và cung cấp cho bạn tín dụng!). Hóa ra tôi đã có mã làm việc trên máy chủ của mình nhưng phải vô tình sao chép một phiên bản cũ hơn vào câu trả lời, xin lỗi.
AdamS
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.