Lập trình mạo danh người dùng khác mà không khiến người dùng hiện đang đăng nhập phải đăng xuất


9

Làm thế nào một mô-đun nên thay đổi giá trị của toàn cầu $user, thực thi mã của chính nó và khôi phục giá trị ban đầu $usermà không khiến người dùng hiện tại bị đăng xuất nếu xảy ra lỗi?


Có một vấn đề cũ mở về điều này, trong đó thêm một chức năng có thể xử lý đúng cách này, ngay cả khi được gọi nhiều lần. Xem drupal.org/node/287292 . Vui lòng xem lại và kiểm tra các bản vá ở đó.
Berdir

1
Đã có một tài liệu Cộng đồng tạo ra giải pháp mạo danh người dùng khác cho Drupal 6, Drupal 7 và Drupal 8 trên drupal.org: Mạo danh người dùng khác một cách an toàn .
iStryker

Câu trả lời:


18

Hàm drupal_cron_run () đưa ra một ví dụ hoàn hảo cho chính xác điều này, vì nó thay đổi người dùng hiện tại thành ẩn danh bất cứ khi nào cron được chạy, sau đó chuyển trở lại sau khi hoàn thành.

// Prevent session information from being saved while doing funky stuff.
$original_session_state = drupal_save_session();
drupal_save_session(FALSE);

// Force the current user to anonymous to ensure consistent permissions on
// funky stuff runs.
$original_user = $GLOBALS['user'];
$GLOBALS['user'] = drupal_anonymous_user(); // Or use user_load() for a non-anonymous user.

// Do funky stuff here...

// Restore the user.
$GLOBALS['user'] = $original_user;
drupal_save_session($original_session_state);

Đáng lưu ý, bạn có thể đặt đối tượng người dùng hiện tại đi đâu đó (trong $GLOBALShoặc chỉ trong một biến khác để giữ an toàn) và chuyển sang bất kỳ người dùng nào bằng cách tải chúng vào user_load(). Điều này cho phép bạn thực hiện một số điều khủng khiếp như giả trang như một người dùng cụ thể được thiết lập với các quyền cụ thể để thực hiện một quy trình cụ thể. Nguyên tắc là như nhau.
Greg

Chỉ có 1 vấn đề tiềm năng với đoạn mã này. Bạn nên lưu phiên cũ trong biến $ old_session. Đặt phiên lưu thành false, sau đó ở cuối drupal_save_session ($ old_session).
iStryker

truy cập và chụp màn hình bằng drupal.org/project/ph Phantomjs_capture như những người dùng khác. Có thể / khó khăn? (DO phát hành drupal.org/node/2899252 ).
kiranking
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.