ユーザーログイン後のリダイレクト


13

ログイン後にユーザーをリダイレクトしたいのhook_user_login()ですが、リダイレクトを使用することはできますか?リダイレクトのパラメーターを追加するにはどうすればよいですか?

回答:


19

ログインフォームを変更し、リダイレクトを処理する送信ハンドラを追加する必要があります。$form_state->setRedirectUrl()フォームalterで直接使用することはできません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
@kiamlalunoによって説明されているように、1つを使用することもできます$form_state->setRedirect('mymodule.dashboard);
フィリペミゲルフォンセカ

3
mymodule.dashboardがすべき/すべきことをこの回答に従うユーザーに説明してください。例として、これを<front>に変更する方法。ユーザーダッシュボードはログイン後のデフォルトのリダイレクトであるため、この例は役に立ちません。新しいユーザーは、変更する部分とリダイレクトの方法を知りません。
-nilsun

1
フロントページにリダイレクトするには、上記の例を使用しますが、$ urlオブジェクトを生成する行を$ url = Url :: fromUri( 'internal:/');に変更します。
oknate

1
elseここで何が起きているのか分かりませんか?既存のリダイレクトを維持しますか?
user1359

1
Drupal \ Core \ Urlを使用する必要があります。それが正しく動作作るために
Jigneshラワル

15

Drupal 8サイトにログインした後のユーザーのリダイレクトは、Drupal 8に合わせてコードを調整する必要があることを除いて、Drupal 7で行われた方法と同じです。

特に:

  • hook_user_login()ログイン後のユーザーのリダイレクトには使用されません。単に、そのフックでユーザーをリダイレクトすると、他のhook_user_login()実装の呼び出しが停止するためです。
  • ユーザーをリダイレクトする正しい方法は、次のようなコードを使用するログインフォームにフォーム送信ハンドラーを追加することです。

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

    user.pageは、ユーザーをリダイレクトするDrupalパスのルーティング名であることに注意してください。クラスの
    インスタンスがある場合はDrupal\Core\Url、次のコードも使用できます。

    $form_state->setRedirectUrl($url);

    ユーザーがログインした同じサイトのページにユーザーをリダイレクトする場合、最初の方法が望ましいことに留意してください。通常、2番目の方法は、外部URLを使用してユーザーをリダイレクトするために使用されます。


11

hook_user_loginを使用して、リダイレクトを試みることができますyourpath

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

また、Rulesモジュールを使用できますが、まだDrupal 8の安定バージョンはありません。


Drupal 8.1でうまく機能した、優れたエレガントなソリューション。
アレクセイレイ16年

3
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION上記の特定の状況でエラーが発生していました-に置き換えreturn;exit;、ヘッダーを設定するリダイレクトが最後に実行されるようにすることをお勧めします。

2
hook_user_login()は、送信ハンドラーの前に呼び出されるため、これらは呼び出されません。以下のYogeshの答えは、これを行うより良い方法です。
18年

9

パーティーに少し遅れましたが、https: //www.drupal.org/node/2068293#comment-11712455に従って、hook_user_login()で宛先を設定して、ログイン処理の最後にリダイレクトすることができます。

すなわち

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

他の回答に従ってFormState :: setRedirect()を使用すると、ほとんどの人のユースケースをカバーし、「正しい」回答になる可能性がありますが、フック_user_loginで宛先クエリパラメータを使用すると、ユーザーにログインするフォーム送信 *がリダイレクトされますが、フォーム/リクエストの他の部分の干渉または事前の知識なし。

つまり、カスタムログインフォームで引き続き機能し、宛先使用しても他のフックは停止しません\Drupal\Core\EventSubscriber\RedirectResponseSubscriber応答処理の最後に実装さ れます)。

* hook_user_login(user_login_finalize())を呼び出し、FormState :: setResponse()を手動で呼び出さないフォーム送信


1
これには、ログインフォーム以外から認証が発生した場合に機能するという利点があります。しかし、これは他のモジュールからの他のhook_user_login実装と干渉しますか?
ジョナサン

1
@Jonathanいいえ、宛先を設定するだけで、早期の要求-> send()または何か(つまり、d7 drupal_gotoなど)は実行されません。 。これは、標準のdrupalログインリダイレクトが行う方法です。
Sut3kh

1
mymodule.dashboardがすべき/すべきことをこの回答に従うユーザーに説明してください。例として、これを<front>に変更する方法。ユーザーダッシュボードはログイン後のデフォルトのリダイレクトであるため、この例は役に立ちません。新しいユーザーは、変更する部分とリダイレクトの方法を知りません。
-nilsun

3
@nilsun mymodule.dashboardはルート名であり、任意のルート名(つまり\Drupal\Core\Url::fromRoute('<front>')->toString()または\Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString())に置き換えることができます 。詳細については、drupal.org / docs
8 /

2
これによりパスワードのリセットが解除されるため、答えを下げます。(別の回答で示唆されているようにuser_login_formのフォーム送信ハンドラーを作成します。)
hansfn

7

ルールを使用して簡単に実行できます

反応:ユーザーがログインした後

  • アクションを追加:>>をリダイレクトし、パラメーターを使用するか、URLを入力します。

3
これに関する主な注意点は、Drupal 8のルールはまだプレリリースアルファ版であるため、Webサイトの安定性が必要な場合は注意してください
フィリップギルバート

1
ユーザーがログインした後にサイトがページにリダイレクトされると、ルールがログインシステムを台無しにします。注意
InspiredCoder

6

また、ユーザーのログインフォームを変更し、代わりに直接使用したカスタムURLにユーザーをリダイレクトする、独自のカスタムは$ form_stateリダイレクトを設定するには、ハンドラ提出する追加することができ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');
}

$ form_stateリダイレクトに追加すると、他の送信ハンドラ/ログインフックが確実に呼び出されます。

Drupal7と同様に、$ form_stateはクラスオブジェクトになっているため、$ form_state ['redirect']を直接設定することはできません。詳細については、FormState :: setRedirect()をチェックアウトしてください。


6

D8では、この目的でユーザーのデフォルトページモジュールを使用できます

このモジュールを使用すると、ログインまたはログアウト後にユーザーがリダイレクトされる宛先をカスタマイズできます。ロールまたは個々のユーザーでカスタマイズできます。


1
動作しますが、パスワードリセットリンクを考慮しません。ユーザーがワンタイムリンクを使用してパスワードを設定すると、ユーザーアカウントではなく、このモジュールで設定したページにリダイレクトされます。
ソリン

1
このモジュールはまだパスワードのリセットを解除するので、私は答えを下げます。drupal.org/project/user_default_page/issues/2991916(別の回答で提案されているようにuser_login_formのフォーム送信ハンドラーを作成する)を参照してください。
hansfn

4

Drupal 8と互換性のある、これを行う簡単なモジュールがあります。これはUser Default Pageと呼ばれます

このモジュールを使用すると、ログインまたはログアウト後にユーザーがリダイレクトされる宛先をカスタマイズできます。ロールまたは個々のユーザーでカスタマイズできます。また、このアクションの構成可能なdrupalメッセージをカスタマイズします。


3

hook_user_login() ユーザーのログイン時に何かをしたい場合に使用されます。Fxコアは、設定されていない場合はローカルタイムゾーンを設定することをユーザーに提案します。

代わりにhook_form_alter、すべてのログインフォームで使用し、フォーム状態オブジェクトにリダイレクトを設定するカスタム送信ハンドラーを追加する必要があります。


2

私は自分のコントローラーでログインフォームを表示しています。そうすれば、非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;

「proreos.home」ルートを必要な宛先に変更します。

よろしく

Rainer



2

私は次のスニペットをかなり頻繁に使用するので、共有したいと思いました。ユーザーが持っている役割に応じて、異なるリダイレクトを追加できます。

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

リダイレクトにはlogintobogganモジュールを使用できます。ユーザー名を使用したログインなどの他の機能が必要な場合に便利な他の構成があります。


2
D7には良い答えですが、この質問にはD8のタグが付けられており、LogintobogganのDrupal 8バージョンはまだありません。
ケリーカレー

1

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

  1. 上記のモジュールをインストールします
  2. カスタムURLパスをURLの宛先パラメーターとして追加します
  3. したがって、上記のモジュールを構成して、

    / user / login to / user / login?destination = 'CUSTOM_NODE_PATH'

    • たとえば、r4032loginモジュールを使用して、認証されたユーザーがURLをコピー/貼り付けしたり、word / excelからのハイパーリンクを使用したりするときに、関連するページにアクセスできるようにします。
    • 他の「ログインリダイレクト」モジュールは、この機能をオーバーライドし、宛先パラメーターがURLに含まれている場合でも、ユーザーが構成済みの単一ページにアクセスできるようにします。

1

この問題に特化した別のオプションは、単純なDrupal 8提供のモジュール:Redirect After Loginです。モジュールは次の場所にあります。

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

説明が示すように、これは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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.