Kullanıcı girişinden sonra yeniden yönlendir


14

Kullanıcıları giriş yaptıktan sonra yeniden yönlendirmek istiyorum. Yeniden yönlendirme hook_user_login()yapmak için kullanmak mümkün müdür ? Yeniden yönlendirme parametresini nasıl eklerim?

Yanıtlar:


19

Oturum açma formunu değiştirmeniz ve yeniden yönlendirmeyle ilgilenecek bir gönderme işleyicisi eklemeniz gerekir. $form_state->setRedirectUrl()Üzerine yazılacağı için doğrudan form değiştirmede kullanamazsınız 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 tarafından açıklandığı gibi, bir de kullanabilirsiniz$form_state->setRedirect('mymodule.dashboard);
Filipe Miguel Fonseca

3
Lütfen bu yanıtı izleyen kullanıcıları mymodule.dashboard'un yapması / yapması gerekenleri açıklayın. Bunu sadece bir örnek için <front> olarak nasıl değiştirebilirim? Kullanıcı gösterge tablosu, giriş yaptıktan sonra varsayılan yönlendirme olduğundan, buradaki örnek işe yaramaz. Yeni kullanıcı hangi parçaları değiştireceğini ve yönlendirmesini nasıl yapacağını bilmiyor.
nilsun

1
Ön sayfaya yönlendirmek için yukarıdaki örneği kullanabilirsiniz ancak $ url nesnesini oluşturan satırı $ url = Url :: fromUri ('internal: /') olarak değiştirin;
oknate

1
elseBurada neler olduğunu anlamıyorum ? Mevcut bir yönlendirmeyi korumak mı istiyorsunuz?
user1359

1
Drupal \ Core \ Url kullanın; düzgün çalışması için nasıl
Jignesh Rawal

16

Drupal 8 sitesinde oturum açtıktan sonra kullanıcıları yeniden yönlendirmek, kodun Drupal 8 için uyarlanması gerekmediği sürece Drupal 7'de yapıldığından farklı değildir.

Özellikle:

  • hook_user_login()kullanıcıları giriş yaptıktan sonra yeniden yönlendirmek için kullanılmaz; yalnızca o kancadaki kullanıcıları yeniden yönlendirmek diğer hook_user_login()uygulamaların çağrılmasını engelleyecektir .
  • Kullanıcıları yeniden yönlendirmenin doğru yolu, giriş formuna aşağıdakine benzer kod kullanan bir form gönderme işleyicisi eklemektir.

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

    User.page'in , kullanıcının yeniden yönlendirilmesini istediğiniz Drupal yolunun yönlendirme adı olduğuna dikkat edin . Sınıfın
    bir örneğine Drupal\Core\Urlsahipseniz, aşağıdaki kodu da kullanabilirsiniz.

    $form_state->setRedirectUrl($url);

    Kullanıcıları giriş yaptıkları sitedeki bir sayfaya yönlendirirken ilk yöntemin tercih edildiğini unutmayın; ikinci yöntem normalde harici bir URL kullanarak kullanıcıları yönlendirmek için kullanılır.


11

hook_user_login adresini kullanabilir ve adresine yönlendirmeyi deneyebilirsinizyourpath

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

Ayrıca Rules modülünü kullanabilirsiniz , ancak Drupal 8 için henüz kararlı bir sürüm yoktur.


İyi ve zarif bir çözüm, Drupal 8.1'de benim için çalıştı.
Alexei Rayu

3
Ben başlamıştı ERR_RESPONSE_HEADERS_MULTIPLE_LOCATIONyukarıdaki ile bazı durumlarda hatalar - Ben değiştirmenizi öneririz return;ile exit;setleri başlıkları - - yönlendirme sağlamak için, yürütülecek en son şeydir.

2
hook_user_login () gönderme işleyicilerinden önce çağrılır, böylece bunların çağrılması önlenir. Yogesh'in aşağıdaki cevabı bunu yapmanın daha iyi bir yoludur.
Imclean

9

Partiye biraz geç ama https://www.drupal.org/node/2068293#comment-11712455 uyarınca, giriş işleminin sonunda yönlendirmek için hook_user_login () içindeki hedefi ayarlayabilirsiniz.

yani

/**
 * 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 () yöntemini diğer yanıtlara göre kullanmak, büyük olasılıkla çoğu kullanıcının kullanım örneklerini kapsayacaktır ve potansiyel olarak 'doğru' yanıttır, ancak hook_user_login ile hedef sorgu parametresini kullanmak , kullanıcı günlüklerinde herhangi bir form gönderme * 'nin yeniden yönlendireceği anlamına gelir. formun / talebin başka herhangi bir kısmının müdahalesi veya önceden bilgisi olmadan.

yani yine de özel bir giriş formu ile çalışacak ve hedefin kullanılması diğer kancaları durdurmaz\Drupal\Core\EventSubscriber\RedirectResponseSubscriber (yanıt işlemenin sonunda tarafından uygulanır ).

* Hook_user_login'i (user_login_finalize ()) çağıran ve FormState :: setResponse () öğesini elle çağırmayan herhangi bir form gönderimi .


1
Kimlik doğrulama, bir giriş formu dışında bir şey olduğunda gerçekleşir. Ancak bu, diğer modüllerden diğer hook_user_login uygulamalarıyla çakışıyor mu?
Jonathan

1
@Jonathan Hayır, sadece hedefi belirler ve erken bir istek yapmaz-> gönder () veya herhangi bir şey (yani d7 drupal_goto gibi), diğer tüm kancaların, geri aramaların vb. . Bu sadece nasıl standart drupal giriş yönlendirme yapıyor.
Sut3kh

1
Lütfen bu yanıtı izleyen kullanıcıları mymodule.dashboard'un yapması / yapması gerekenleri açıklayın. Bunu sadece bir örnek için <front> olarak nasıl değiştirebilirim? Kullanıcı gösterge tablosu, giriş yaptıktan sonra varsayılan yönlendirme olduğundan, buradaki örnek işe yaramaz. Yeni kullanıcı hangi parçaları değiştireceğini ve yönlendirmesini nasıl yapacağını bilmiyor.
nilsun

3
@nilsun mymodule.dashboard, rota adıdır ve herhangi bir rota adıyla (yani \Drupal\Core\Url::fromRoute('<front>')->toString()veya \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()) değiştirilebilir. Daha fazla bilgi için bkz drupal.org/docs/8/api/routing-system/routing-system-overview ve api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/...
Sut3kh

2
Bu şifre sıfırlamayı sonlandırır, bu yüzden cevabı aşağı oyluyorum (Başka bir cevap çalışmasında önerildiği gibi user_login_form için form gönderme işleyicisi oluşturma.)
hansfn

7

Bunu Kurallar'ı kullanarak kolayca yapabilirsiniz

Tepki açık: Kullanıcı giriş yaptıktan sonra

  • Eylem ekleyin: Yönlendir >> 'i kullanın, ardından bir parametre kullanın veya URL'nizi yazın.

3
Bununla ilgili ana uyarı, Kuralların hala Drupal 8 için yayın öncesi ALPHA'da olmasıdır, bu nedenle web sitenizde istikrara ihtiyacınız varsa dikkatli olun
Philippe Gilbert

1
Kullanıcı oturum açtıktan sonra site bir sayfaya yönlendirdiğinde kurallar giriş sistemini
InspiredCoder

6

Ayrıca, hook_user_login kullanarak kullanıcıyı doğrudan özel URL'nize yönlendirmek yerine, kullanıcı giriş formunu değiştirebilir ve $ form_state yönlendirmesini ayarlamak için kendi özel gönderme işleyicinizi ekleyebilirsiniz .

<?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 redirect içine eklediğinizde, diğer gönderme işleyicileri / giriş kancaları çağrılır.

Drupal7 gibi, $ form_state ['redirect'] 'i doğrudan ayarlayamayız, çünkü $ form_state artık sınıf nesnesidir. Ödeme FormState :: setRedirect () Daha fazla detay için.


6

D8'de, bu amaç için kullanıcı varsayılan sayfa modülünü kullanabilirsiniz .

Bu modül, oturum açtıktan veya oturumu kapattıktan sonra kullanıcının yönlendirildiği hedefi özelleştirmenizi sağlar. Rollere veya tek tek kullanıcılara göre özelleştirebilirsiniz.


1
Çalışır, ancak parola sıfırlama bağlantılarını dikkate almaz, kullanıcı parolalarını ayarlamak için tek seferlik bağlantıyı kullandığında, bunları kullanıcı hesabına değil, bu modülde ayarladığınız sayfaya yönlendirir.
Sorin

1
Bu modül hala şifre sıfırlamayı kırıyor, bu yüzden cevabı aşağı indiriyorum. Bkz. Drupal.org/project/user_default_page/issues/2991916 (Başka bir yanıt çalışmasında önerildiği gibi user_login_form için form gönderme işleyicisi oluşturma.)
hansfn

4

Bunu yapmak için Drupal 8 ile uyumlu basit bir modül vardır. Buna Varsayılan Kullanıcı Sayfası denir .

Modül, oturum açtıktan veya oturumu kapattıktan sonra kullanıcının yönlendirildiği hedefi özelleştirmenizi sağlar. Rollere veya tek tek kullanıcılara göre özelleştirebilirsiniz. Ve bu eylemler için yapılandırılabilir drupal mesajlarını özelleştirin.


3

hook_user_login() yeniden yönlendirme için çalışmazsa, oturum açtığında kullanıcıyla bir şeyler yapmak istiyorsanız kullanılır. Fx core, kullanıcılara ayarlanmamışsa yerel saat dilimini ayarlamalarını önerir.

Bunun yerine hook_form_alter, tüm giriş formlarında kullanmanız ve form durumu nesnesine yönlendirmeyi ayarlayan özel bir gönderme işleyicisi eklemeniz gerekir.


2

Giriş formunu kendi denetleyicimde görüntülüyorum. Bu şekilde, OO olmayan kancalar olmadan formu değiştirmek (ve kullanıcıyı oturum açtıktan sonra yönlendirmek) mümkündür:

$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' yolunu ihtiyacınız olan hedefe değiştirin.

Saygılarımızla

Rainer



2

Aşağıdaki snippet'i çok kullanıyorum, bu yüzden paylaşacağımı düşündüm. Kullanıcının rolüne bağlı olarak farklı yönlendirmeler ekleyebilirsiniz.

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

Yeniden yönlendirme için logintoboggan modülünü kullanabilirsiniz . Kullanıcı adlarını kullanarak oturum açma gibi diğer işlevler için yararlı olabilecek başka yapılandırmalara sahiptir.


2
D7 için iyi bir yanıt, ancak bu soru D8 olarak etiketlendi ve henüz Logintoboggan'ın Drupal 8 sürümü yok.
Kelley Curry

1

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

  1. Yukarıdaki modülü takın
  2. URL'deki hedef parametre olarak özel URL yolu ekleyin
  3. Bu nedenle, yukarıdaki modülü

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

    • Kimliği doğrulanmış kullanıcıların URL'yi kopyalayıp / yapıştırdıklarında veya örneğin word / excel'den bir köprü kullandıklarında ilgili sayfaya erişmelerine izin vermek için r4032login modülünü kullanmak istedim .
    • Diğer 'giriş yönlendirme' modülleri bu işlevi geçersiz kılar ve hedef parametreler URL'ye dahil edilmiş olsa bile kullanıcıların yapılandırılmış tek bir sayfaya gelmesine izin verir

1

Bu sorun için özellikle başka bir seçenek de basit bir Drupal 8 katkıda bulunan modül: Girişten Sonra Yeniden Yönlendir . Modül burada bulunabilir:

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

Açıklamanın gösterdiği gibi, Drupal güvenlik danışma politikası kapsamında basit, odaklanmış bir modüldür.


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

Diğer birçok seçenek 8 yeni sürümlerinde kırılıyor çünkü hook_user_login bağımlı diğer şeyler etrafında almak için bir yol üzerinde çalışıyordu. / ya da sadece dışarıda asılı durma kaynakları. Bu basit mantığı, oturum açma işlemlerini işlemek için özel bir modüle koydum:

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

Bunu Drupal 8.8.3 ile başarıyla kullanıyorum ve REST giriş taleplerimi oluşturduğum başka bir modülden kırmıyor, yeni hesap kreasyonları için doğru bir şekilde yönlendiriyor ve daha sonra normal bir site girişinde farklı bir sayfaya yönlendiriyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.