Chuyển hướng sau khi người dùng đăng nhập


13

Tôi muốn chuyển hướng người dùng sau khi họ đăng nhập. Có thể sử dụng hook_user_login()để thực hiện chuyển hướng không? Làm cách nào để thêm tham số cho chuyển hướng?

Câu trả lời:


19

Bạn cần thay đổi hình thức đăng nhập và thêm một trình xử lý trình sẽ đảm nhiệm việc chuyển hướng. Bạn không thể sử dụng $form_state->setRedirectUrl()trực tiếp trong biểu mẫu thay đổi, vì nó sẽ bị ghi đè bởi UserForm::submitForm().

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_user_login_form_alter(&$form, FormStateInterface $form_state) {
  $form['#submit'][] = 'mymodule_user_login_submit';
}

/**
 * Form submission handler for user_login_form().
 *
 * Redirects the user to the dashboard after logging in.
 */
function mymodule_user_login_submit(&$form, FormStateInterface $form_state) {
  $url = Url::fromRoute('mymodule.dashboard');

  // Check if a destination was set, probably on an exception controller.
  // @see \Drupal\user\Form\UserLoginForm::submitForm()
  $request = \Drupal::service('request_stack')->getCurrentRequest();
  if (!$request->request->has('destination')) {
    $form_state->setRedirectUrl($url);
  }
  else {
    $request->query->set('destination', $request->request->get('destination'));
  }
}

4
Theo mô tả của @kiamlaluno, người ta cũng có thể sử dụng$form_state->setRedirect('mymodule.dashboard);
Filipe Miguel Fonseca

3
Vui lòng giải thích những người dùng theo dõi câu trả lời này những gì mymodule.dashboard nên / sẽ làm. Làm thế nào để thay đổi điều đó thành <front>, chỉ là một ví dụ. Vì bảng điều khiển người dùng là chuyển hướng mặc định sau khi đăng nhập, ví dụ này ở đây là vô ích. Người dùng mới không biết nên thay đổi bộ phận nào và làm thế nào để chuyển hướng.
nilsun

1
Để chuyển hướng đến trang trước, bạn có thể sử dụng ví dụ trên nhưng thay đổi dòng tạo đối tượng $ url thành $ url = Url :: fromUri ('Internal: /');
oknate

1
Tôi không hiểu chuyện gì đang xảy ra ở elseđây? Duy trì một chuyển hướng hiện có?
dùng1359

1
bạn phải sử dụng Drupal \ Core \ Url; để làm cho nó hoạt động chính xác
Jignesh Rawal

15

Chuyển hướng người dùng sau khi họ đăng nhập trên trang web Drupal 8 không khác với cách thực hiện trên Drupal 7, ngoại trừ mã cần được điều chỉnh cho Drupal 8.

Đặc biệt:

  • hook_user_login()không được sử dụng để chuyển hướng người dùng sau khi họ đăng nhập, đơn giản vì thực tế là việc chuyển hướng người dùng trong hook đó sẽ ngăn các hook_user_login()triển khai khác không được gọi.
  • Cách chính xác để chuyển hướng người dùng là thêm trình xử lý gửi biểu mẫu vào biểu mẫu đăng nhập sử dụng mã tương tự như sau.

    $form_state->setRedirect('user.page');

    Lưu ý rằng user.page là tên định tuyến cho đường dẫn Drupal nơi bạn muốn người dùng được chuyển hướng.
    Nếu bạn có một thể hiện của Drupal\Core\Urllớp, bạn cũng có thể sử dụng mã sau đây.

    $form_state->setRedirectUrl($url);

    Hãy nhớ rằng phương pháp đầu tiên là thích hợp hơn khi bạn chuyển hướng người dùng đến một trang trong cùng trang web mà họ đã đăng nhập; phương pháp thứ hai thường được sử dụng để chuyển hướng người dùng sử dụng URL bên ngoài.


11

bạn có thể sử dụng hook_user_login và cố gắng chuyển hướng đếnyourpath

function yourmodule_user_login($account) {
  // We want to redirect user on login.
  $response = new RedirectResponse("yourpath");
  $response->send();
  return;
}

Ngoài ra, bạn có thể sử dụng mô-đun Rules , nhưng vẫn chưa có phiên bản ổn định cho Drupal 8.


Một giải pháp thanh lịch tốt, đã làm việc cho tôi trong Drupal 8.1.
Alexei Rayu

3
Tôi đã gặp ERR_RESPONSE_HEADERS_MULTIPLE_LOCATIONlỗi trong một số trường hợp ở trên - tôi đề nghị thay thế return;bằng exit;, để đảm bảo chuyển hướng - thiết lập tiêu đề - là điều cuối cùng được thực thi.

2
hook_user_login () được gọi trước trình xử lý trình để việc này sẽ ngăn chúng được gọi. Câu trả lời của Yogesh dưới đây là một cách tốt hơn để làm điều này.
imclean

9

Đến bữa tiệc muộn nhưng theo https://www.drupal.org/node/2068293#comment-11712455 bạn có thể đặt đích trong hook_user_login () để chuyển hướng khi kết thúc quá trình xử lý đăng nhập.

I E

/**
 * Implements hook_user_login().
 */
function mymodule_user_login(\Drupal\user\UserInterface $account) {
  // Ignore password reset.
  $route_name = \Drupal::routeMatch()->getRouteName();
  if ($route_name !== 'user.reset.login') {
    // Do not interfere if a destination was already set.
    $current_request = \Drupal::service('request_stack')->getCurrentRequest();
    if (!$current_request->query->get('destination')) {
      // Default login destination to the dashboard.
      $current_request->query->set(
        'destination',
        \Drupal\Core\Url::fromRoute('mymodule.dashboard')->toString()
      );
    }
  }
}

Sử dụng FormState :: setRedirect () theo các câu trả lời khác có thể sẽ bao gồm hầu hết các trường hợp sử dụng của mọi người và có khả năng là câu trả lời 'đúng', tuy nhiên sử dụng tham số truy vấn đích với hook_user_login có nghĩa là bất kỳ biểu mẫu nào gửi * mà người dùng đăng nhập sẽ chuyển hướng nhưng không can thiệp hoặc hiểu biết trước về bất kỳ phần nào khác của mẫu / yêu cầu.

tức là nó vẫn sẽ hoạt động với một hình thức đăng nhập tùy chỉnh và việc sử dụng đích không dừng bất kỳ hook nào khác (nó được thực hiện \Drupal\Core\EventSubscriber\RedirectResponseSubscriberkhi kết thúc quá trình xử lý phản hồi).

* Bất kỳ biểu mẫu nào gửi lệnh hook_user_login (user_login_finalize ()) và không gọi thủ công FormState :: setResponse () .


1
Điều này có lợi thế làm việc nếu xác thực xảy ra từ một cái gì đó không phải là một hình thức đăng nhập. Nhưng điều này có can thiệp vào các triển khai hook_user_login khác từ các mô-đun khác không?
Jonathan

1
@Jonathan Không, nó chỉ đặt đích và không thực hiện yêu cầu sớm-> send () hoặc bất cứ điều gì (ví dụ như d7 drupal_goto), nó sẽ cho phép tất cả các hook khác, gọi lại, v.v. chạy như bình thường trước khi nó được thực hiện . Đây chỉ là cách chuyển hướng đăng nhập drupal tiêu chuẩn thực hiện nó.
Sut3kh

1
Vui lòng giải thích những người dùng theo dõi câu trả lời này những gì mymodule.dashboard nên / sẽ làm. Làm thế nào để thay đổi điều đó thành <front>, chỉ là một ví dụ. Vì bảng điều khiển người dùng là chuyển hướng mặc định sau khi đăng nhập, ví dụ này ở đây là vô ích. Người dùng mới không biết nên thay đổi bộ phận nào và làm thế nào để chuyển hướng.
nilsun

3
@nilsun mymodule.dashboardlà tên tuyến và có thể được thay thế bằng bất kỳ tên tuyến nào (tức là \Drupal\Core\Url::fromRoute('<front>')->toString()hoặc \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()). Để biết thêm thông tin, hãy xem drupal.org/docs/8/api/routing-system/routing-system-overviewapi.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/ của
Sut3kh

2
Điều này phá vỡ thiết lập lại mật khẩu để tôi bỏ phiếu trả lời. (Tạo trình xử lý gửi biểu mẫu cho user_login_form như được đề xuất trong câu trả lời khác hoạt động.)
hansfn

7

Bạn chỉ có thể làm điều đó bằng cách sử dụng Quy tắc

Phản ứng lại: Sau khi người dùng đã đăng nhập

  • Thêm hành động: Chuyển hướng >> sau đó sử dụng một tham số hoặc nhập url của bạn.

3
Thông báo chính cho vấn đề này là Rules vẫn đang được phát hành trước ALPHA cho Drupal 8, vì vậy hãy cẩn thận nếu bạn cần sự ổn định trên trang web của mình
Philippe Gilbert

1
Các quy tắc làm rối hệ thống đăng nhập khi trang web đã chuyển hướng đến một trang sau khi người dùng đăng nhập. Cẩn thận
InspiredCoder

6

Bạn cũng có thể thay đổi biểu mẫu đăng nhập người dùng và thêm trình xử lý gửi tùy chỉnh của riêng bạn để đặt chuyển hướng $ form_state, thay vì chuyển hướng trực tiếp người dùng đến URL tùy chỉnh của bạn bằng hook_user_login .

<?php
/**
 * Implements hook_form_alter().
 */
function [MODULENAME]_form_alter(&$form, \Drupal\Core\Form\FormStateInterface\FormStateInterface $form_state, $form_id) {
  switch ($form_id) {
    // Alter login form and add own custom submit handler.
    case 'user_login_form':
      $form['#submit'][] = '_[MODULENAME]_user_login_form_submit';
      break;
  }
}

/**
 * Custom submit handler for login form.
 */
function _[MODULENAME]_user_login_form_submit($form, FormStateInterface $form_state) {
  // Set redirect to login form.
  $form_state->setRedirect('YOUR.MENU-ROUTER.NAME');
}

Thêm nó vào $ form_state redirect sẽ đảm bảo rằng các trình xử lý gửi / móc đăng nhập khác được gọi.

Giống như Drupal7, chúng ta không thể đặt trực tiếp $ form_state ['redirect'], vì $ form_state hiện là đối tượng lớp. Thanh toán FormState :: setRedirect () để biết thêm chi tiết.


6

Trong D8, bạn có thể sử dụng mô-đun trang mặc định của người dùng cho mục đích này.

Mô-đun này cho phép bạn tùy chỉnh đích mà người dùng được chuyển hướng đến sau khi đăng nhập hoặc đăng xuất. Bạn có thể tùy chỉnh theo vai trò hoặc người dùng cá nhân.


1
Hoạt động nhưng không xem xét các liên kết đặt lại mật khẩu, khi người dùng sử dụng liên kết một lần để đặt mật khẩu, họ sẽ chuyển hướng họ đến trang bạn đặt trong mô-đun này chứ không phải tài khoản người dùng.
Sorin

1
Mô-đun này vẫn phá vỡ thiết lập lại mật khẩu để tôi bỏ phiếu trả lời. Xem drupal.org/project/user_default_page/issues/2991916 (Tạo trình xử lý gửi biểu mẫu cho user_login_form như được đề xuất trong một câu trả lời khác hoạt động.)
hansfn

4

Có một mô-đun đơn giản để làm điều này tương thích với Drupal 8. Nó được gọi là Trang mặc định của người dùng .

Mô-đun cho phép bạn tùy chỉnh đích mà người dùng được chuyển hướng đến sau khi đăng nhập hoặc đăng xuất. Bạn có thể tùy chỉnh theo vai trò hoặc người dùng cá nhân. Và tùy chỉnh các tin nhắn drupal cấu hình cho hành động này.


3

hook_user_login() không hoạt động để chuyển hướng, nó được sử dụng nếu bạn muốn làm gì đó với người dùng khi anh ta đăng nhập. Lõi Fx gợi ý người dùng đặt múi giờ cục bộ nếu nó không được đặt.

Thay vào đó, bạn cần sử dụng hook_form_altertrên tất cả các biểu mẫu đăng nhập và thêm trình xử lý gửi tùy chỉnh để đặt chuyển hướng trên đối tượng trạng thái biểu mẫu.


2

Tôi đang hiển thị các hình thức đăng nhập trong bộ điều khiển của riêng tôi. Bằng cách đó, có thể thao tác biểu mẫu (và do đó chuyển hướng người dùng sau khi đăng nhập) mà không cần các móc nối không OO:

$fb = $this->formBuilder();
$rc['top'] = ['#markup' => '<p>Willkommen im Kundenbereich von proreos. 
    Bitte melden Sie sich hier mit Ihrem
    Benutzernamen oder Ihrer Email Addresse an.</p>'];
$form = $fb->getForm("Drupal\user\Form\UserLoginForm");

$ug = $this->getUrlGenerator();
$redir = $ug->generateFromRoute('proreos.home', [], 
         ['query' => $this->getDestinationArray(), 'external' => FALSE]);
$form['#action'] = $redir;

$rc['login'] = $form;

return $rc;

Thay đổi tuyến đường 'proreos.home' thành bất kỳ điểm đến nào bạn cần.

Trân trọng

Cơn mưa



2

Tôi sử dụng đoạn mã sau khá nhiều vì vậy tôi nghĩ tôi sẽ chia sẻ nó. Bạn có thể thêm các chuyển hướng khác nhau tùy thuộc vào vai trò của người dùng.

use Symfony\Component\HttpFoundation\RedirectResponse;

/**
 * Redirect on login.
 */
function MYMODULE_user_login($account) {
  $roles = $account->getRoles();
  if(in_array('webmaster', $roles)) {
    $response = new RedirectResponse('/admin/content');
    $response->send();
  }
}


1

Bạn có thể sử dụng mô-đun logintoboggan để chuyển hướng. Nó có các cấu hình khác có thể hữu ích nếu bạn muốn các chức năng khác như đăng nhập bằng tên người dùng.


2
Câu trả lời hay cho D7, nhưng câu hỏi này được gắn thẻ D8 và chưa có phiên bản Drupal 8 nào của Logintoboggan.
Kelley Curry

1

https://www.drupal.org/project/redirect

  1. Cài đặt mô-đun trên
  2. Thêm đường dẫn url tùy chỉnh làm tham số đích trong url
  3. Vì vậy, cấu hình mô-đun trên để chuyển hướng từ

    / người dùng / đăng nhập vào / người dùng / đăng nhập? Destination = 'CUSTOM_NODE_PATH'

    • Muốn sử dụng mô-đun r4032login để cho phép người dùng được xác thực truy cập trang có liên quan, khi họ sao chép / dán url hoặc sử dụng siêu liên kết từ word / excel chẳng hạn.
    • Các mô-đun 'chuyển hướng đăng nhập' khác sẽ ghi đè chức năng này và chỉ cho phép người dùng hạ cánh trên một trang được định cấu hình ngay cả khi các tham số đích được bao gồm trong url

1

Một tùy chọn khác dành riêng cho vấn đề này là một mô-đun đóng góp Drupal 8 đơn giản: Chuyển hướng sau khi đăng nhập . Các mô-đun có thể được tìm thấy ở đây:

https://www.drupal.org/project/redirect_after_login

Như mô tả cho thấy, nó là một mô-đun đơn giản, tập trung được bao phủ bởi chính sách tư vấn bảo mật Drupal.


1

/**
 * hook_user_login Redirect to English language whenever admin login
 **/
function modulename_user_login($account) {
  // We want to redirect user on login.
  $response = new Symfony\Component\HttpFoundation\RedirectResponse("/en/admin/config");
  $response->send();
  return;
}
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.