web-dev-qa-db-ja.com

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

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

14
John Chan

ログインフォームを変更し、リダイレクトを処理する送信ハンドラを追加する必要があります。 $form_state->setRedirectUrl()によって上書きされるため、UserForm::submitForm()をalter形式で直接使用することはできません。

/**
 * 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'));
  }
}
19
pfrenssen

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を使用してユーザーをリダイレクトするために使用されます。

16
kiamlaluno

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

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

ルールモジュール も使用できますが、Drupal 8の安定版はまだありません。

11
Yusef

パーティーに少し遅れますが 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()を使用すると、おそらくほとんどの人のユースケースがカバーされ、潜在的に「正しい」回答になります。ただし、hook_user_loginで宛先クエリパラメータを使用すると、any form submit*ユーザーのログインはリダイレクトされますが、フォーム/リクエストの他の部分に関する干渉や事前の知識はありません。

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

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

9
Sut3kh

Rules を使用するだけで簡単に実行できます

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

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

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

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

6

hook_user_login を使用してユーザーを直接カスタムURLにリダイレクトする代わりに、ユーザーログインフォームを変更して独自のカスタム送信ハンドラを追加し、$ form_stateリダイレクトを設定することもできます。

<?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
Yogesh

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

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

4

hook_user_login()はリダイレクトでは機能しません。ユーザーがログインしたときに何かを実行したい場合に使用されます。Fxコアは、ローカルタイムゾーンが設定されていない場合は設定するようユーザーに提案します。

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

3
googletorp

ログインURLにdestinationパラメータを追加するだけです。
例:http://example.com/user/login?destination=/my-page

403(アクセス拒否)ページでそれを行う場合は、次のモジュールを使用します。
https://www.drupal.org/project/redirect_403_to_login_page

2
Lost Koder

自分のコントローラにログインフォームを表示しています。そうすれば、非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'ルートを必要な目的地に変更します。

よろしく

ライナー

2
Rainer Feike

次のスニペットをよく使っているので、共有したいと思いました。ユーザーの役割に応じて、さまざまなリダイレクトを追加できます。

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

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

1
nitvirus

次のいずれかのモジュールを使用します。

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

OR

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

乾杯

1
Gaurav Singh

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
Abhi

この問題に特化した別のオプションは、単純なDrupal 8寄稿モジュール:リダイレクト後のリダイレクトです。モジュールは次の場所にありますここに:

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

説明に示されているように、これは、Drupalセキュリティアドバイザリポリシーでカバーされている、シンプルでフォーカスされたモジュールです。

1
bkudrle

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

他の多くのオプションが新しいバージョンの8で壊れているため、私はhook_user_loginに依存する他のものを回避する方法に取り組んでいました。他のいくつかのリダイレクトモジュールは多くの脚注を実行しますそれは、もはや関連性がないか、および/または単に正に独り占めのリソースのいずれかです。この単純なロジックを、ログインプロセスを処理するためのカスタムモジュールにまとめました。

function hook_user_login( UserInterface $account ) {
  // Doing checks to see if the login is from an HTML Origin or not.
  // Could be from RESTful request to logins
  $request = \Drupal::request();
  if ($request->getRequestFormat() !== 'html') {
    // default
    return;
  }

  // Get the destination to see where the login request is going.
  // This is useful to check for interactions from user creations.
  $destination = $request->query->get('destination');

  // Check the destination. If the destination will result in a re-direct 
  // to your homepage (here statically defined, but could be programmatic)
  // then you can force re-direct to a different page. This is the URL defined
  // in config > system > basic site settings.
  if ($destination && $destination === '/whatever-homepage-uri-is') {
    // Regular login, send to alternate welcome page
    $response = new RedirectResponse('/welcome');
    $response->send();
    exit;
  }

  // default
  return;
}

私はこれをDrupal 8.8.3で正常に使用していて、自分のREST作成した別のモジュールからのログイン要求を壊さず、新しいものに正しくリダイレ​​クトしますアカウントの作成後、通常のサイトログインで別のページにリダイレクトします。

0
Ron