답변:
로그인 양식을 변경하고 리디렉션을 처리 할 제출 핸들러를 추가해야합니다. 에 $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'));
}
}
else
여기서 무슨 일이 일어나고 있는지 이해하지 못 합니까? 기존 리디렉션을 유지 하시겠습니까?
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을 사용하여 사용자를 리디렉션하는 데 사용됩니다.
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의 안정적인 버전은 아직 없습니다.
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
위의와 특정 상황에서 오류를 - 내가 교체 제안 return;
으로 exit;
세트 헤더 - - 리디렉션을 보장하는 것은, 실행해야 할 마지막 일이다.
파티에 늦었지만 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를 호출하지 않습니다 .
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-overview 및 api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/…
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 () 자세한 내용은.
D8에서는 이 목적 으로 사용자 기본 페이지 모듈을 사용할 수 있습니다 .
이 모듈을 사용하면 로그인 또는 로그 아웃 한 후 사용자가 리디렉션되는 대상을 사용자 정의 할 수 있습니다. 역할 또는 개별 사용자별로 사용자 정의 할 수 있습니다.
이를 위해 Drupal 8과 호환되는 간단한 모듈이 있습니다. 이를 사용자 기본 페이지 라고 합니다.
이 모듈을 사용하면 로그인 또는 로그 아웃 한 후 사용자가 리디렉션되는 대상을 사용자 정의 할 수 있습니다. 역할 또는 개별 사용자별로 사용자 정의 할 수 있습니다. 이 작업에 대해 구성 가능한 drupal 메시지를 사용자 정의하십시오.
내 컨트롤러에 로그인 양식을 표시하고 있습니다. 그렇게하면 비 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'경로를 원하는 목적지로 변경하십시오.
문안 인사
라이너
destination
로그인 URL 에 매개 변수를 추가 하기 만하면 됩니다.
예:http://example.com/user/login?destination=/my-page
403 (액세스 거부) 페이지에 대해 수행하는 경우 다음 모듈을 사용 하십시오 .
https://www.drupal.org/project/redirect_403_to_login_page
다음 스 니펫을 많이 사용하므로 공유 할 것이라고 생각했습니다. 사용자의 역할에 따라 다른 리디렉션을 추가 할 수 있습니다.
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();
}
}
다음 모듈 중 하나를 사용하십시오.
https://www.drupal.org/project/login_redirect
또는
https://www.drupal.org/project/login_destination
건배
logintoboggan 모듈을 사용 하여 리디렉션 할 수 있습니다 . 사용자 이름을 사용한 로그인과 같은 다른 기능을 원할 경우 유용 할 수있는 다른 구성이 있습니다.
https://www.drupal.org/project/redirect
따라서 위의 모듈을 리디렉션하도록 구성하십시오.
/ user / login to / user / login? destination = 'CUSTOM_NODE_PATH'
이 문제에 대한 또 다른 옵션은 간단한 Drupal 8 기고 모듈입니다 : 로그인 후 리디렉션 . 모듈은 여기에서 찾을 수 있습니다 :
https://www.drupal.org/project/redirect_after_login
설명에서 알 수 있듯이 Drupal 보안 권고 정책에서 다루는 간단하고 집중적 인 모듈입니다.
나는 다른 많은 옵션이 최신 버전의 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 로그인 요청을 중단하지 않고 새 계정 생성을 위해 올바르게 리디렉션 한 다음 일반 사이트 로그인의 다른 페이지로 리디렉션합니다.
$form_state->setRedirect('mymodule.dashboard);