사용자 로그인 후 리디렉션


14

로그인 한 후 사용자를 리디렉션하고 싶습니다. 리디렉션에 사용할 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에 의해 설명 된 바와 같이, 하나는 또한 사용할 수 있습니다$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 Rawal

16

Drupal 8 사이트에 로그인 한 후 사용자를 리디렉션하는 것은 Drupal 8에 맞게 코드를 수정해야한다는 점을 제외하고 Drupal 7에서 수행 한 방식과 다르지 않습니다.

특히:

  • hook_user_login()는 로그인 후 사용자를 리디렉션하는 데 사용되지 않습니다. 단순히 해당 후크에서 사용자를 리디렉션하면 다른 hook_user_login()구현이 호출되지 않습니다.
  • 사용자를 리디렉션하는 올바른 방법은 다음과 유사한 코드를 사용하는 양식 제출 핸들러를 로그인 양식에 추가하는 것입니다.

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

    통지 user.page은 당신이 사용자가 리디렉션 할 드루팔 경로에 대한 라우팅 이름입니다. 클래스
    의 인스턴스가있는 경우 Drupal\Core\Url다음 코드를 사용할 수도 있습니다.

    $form_state->setRedirectUrl($url);

    사용자를 로그인 한 동일한 사이트의 페이지로 사용자를 리디렉션 할 때 첫 번째 방법을 사용하는 것이 좋습니다. 두 번째 방법은 일반적으로 외부 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;
}

또한 규칙 모듈을 사용할 수 있지만 Drupal 8의 안정적인 버전은 아직 없습니다.


좋은 우아한 솔루션은 Drupal 8.1에서 저에게 효과적이었습니다.
Alexei Rayu

3
내가지고 있다고 ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION위의와 특정 상황에서 오류를 - 내가 교체 제안 return;으로 exit;세트 헤더 - - 리디렉션을 보장하는 것은, 실행해야 할 마지막 일이다.

2
제출 핸들러 전에 hook_user_login ()이 호출되므로 호출 핸들러가 호출되지 않습니다. 아래의 요 게시의 대답은 이것을하는 더 좋은 방법입니다.
부정한

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 ()를 사용하면 대부분의 사람들의 유스 케이스를 포괄하고 잠재적으로 '올바른'답변이지만 hook_user_login과 함께 대상 쿼리 매개 변수를 사용 하면 사용자가 로그인 한 양식 제출 *이 리디렉션되지만 양식 / 요청의 다른 부분에 대한 간섭이나 사전 지식없이

즉, 여전히 사용자 정의 로그인 양식으로 작동하며 대상을 사용하더라도 다른 후크가 중지되지 않습니다 ( \Drupal\Core\EventSubscriber\RedirectResponseSubscriber응답 처리가 끝날 때 구현 됨 ).

* 어떤 형태) (즉, 발동 hook_user_login (user_login_finalize ()) 제출 및 수동 FormState :: setResponse를 호출하지 않습니다 .


1
이것은 로그인 폼 이외의 것에서 인증이 발생하는 경우 작동하는 이점이 있습니다. 그러나 이것이 다른 모듈의 다른 hook_user_login 구현을 방해합니까?
Jonathan

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/api/routing-system/routing-system-overviewapi.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/…
Sut3kh

2
암호 재설정이 중단되어 답변을 투표에 넣지 않습니다. (다른 답변에서 제안 된대로 user_login_form에 대한 양식 제출 핸들러 작성.)
hansfn

7

당신은 단순히 규칙 을 사용하여 그것을 할 수 있습니다

반응 : 사용자가 로그인 한 후

  • 작업 추가 : 리디렉션 >> 다음 매개 변수를 사용하거나 URL을 입력하십시오.

3
이에 대한 주요주의해야 할 점은 당신이 당신의 웹 사이트에 안정성을 필요로하는 경우 돌봐 있도록 드루팔 8 시험판 ALPHA 여전히 규칙이다
필립 길버트

1
사용자가 로그인 한 후 사이트가 페이지로 리디렉션되면 규칙이 로그인 시스템을 엉망으로 만듭니다.주의
InspiredCoder

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

D8에서는 이 목적 으로 사용자 기본 페이지 모듈을 사용할 수 있습니다 .

이 모듈을 사용하면 로그인 또는 로그 아웃 한 후 사용자가 리디렉션되는 대상을 사용자 정의 할 수 있습니다. 역할 또는 개별 사용자별로 사용자 정의 할 수 있습니다.


1
작동하지만 비밀번호 재설정 링크를 고려하지 않습니다. 사용자가 일회용 링크를 사용하여 비밀번호를 설정하면 사용자 계정이 아닌이 모듈에서 설정 한 페이지로 리디렉션됩니다.
Sorin

1
이 모듈은 여전히 ​​암호 재설정을 중단하므로 답을 다운 투표합니다. drupal.org/project/user_default_page/issues/2991916 (다른 답변에서 제안 된대로 user_login_form에 대한 양식 제출 핸들러 작성)을 참조하십시오 .
hansfn

4

이를 위해 Drupal 8과 호환되는 간단한 모듈이 있습니다. 이를 사용자 기본 페이지 라고 합니다.

이 모듈을 사용하면 로그인 또는 로그 아웃 한 후 사용자가 리디렉션되는 대상을 사용자 정의 할 수 있습니다. 역할 또는 개별 사용자별로 사용자 정의 할 수 있습니다. 이 작업에 대해 구성 가능한 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'경로를 원하는 목적지로 변경하십시오.

문안 인사

라이너



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 태그가 지정되어 있으며 아직 Drupal 8 버전의 Logintoboggan이 없습니다.
Kelley Curry

1

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

  1. 위 모듈을 설치하십시오
  2. URL의 도착 매개 변수로 맞춤 URL 경로 추가
  3. 따라서 위의 모듈을 리디렉션하도록 구성하십시오.

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

    • 인증 된 사용자가 URL을 복사 / 붙여 넣기하거나 단어 / excel의 하이퍼 링크를 사용할 때 관련 페이지에 액세스 할 수 있도록 r4032login 모듈 을 사용 하려고했습니다 .
    • 다른 '로그인 리디렉션'모듈은이 기능을 재정의하고 대상 매개 변수가 URL에 포함 된 경우에도 사용자가 구성된 단일 페이지에 도달 할 수 있도록합니다.

1

이 문제에 대한 또 다른 옵션은 간단한 Drupal 8 기고 모듈입니다 : 로그인 후 리디렉션 . 모듈은 여기에서 찾을 수 있습니다 :

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

0

나는 다른 많은 옵션이 최신 버전의 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 로그인 요청을 중단하지 않고 새 계정 생성을 위해 올바르게 리디렉션 한 다음 일반 사이트 로그인의 다른 페이지로 리디렉션합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.