web-dev-qa-db-ja.com

DrupalログインがSSO(外部)サーバーのログインページにリダイレクトしない

Drupal認証をSSOサーバーからの認証に置き換えようとしています ここ で説明されているシナリオで。login_blockを変更しようとしています(「ホームページ」および「アクセス拒否」ページ)、およびlogin_block_formmysite.com/user/login)。デフォルトの[ログイン]ボタンをリセットし、[SSOログイン]ボタンに置​​き換えました、および#submitdrupal_gotoを使用して、SSOサーバーのログインページにリダイレクトしようとしていますが、それでもmysite.com/node?destination=nodeにリダイレクトされます。問題が何であるかを理解するために。

function MODULE_form_alter(&$form, $form_state, $form_id) {
  if ($form_id == 'user_login_block' || $form_id == 'user_login') {
    // Add a button to form, used to login to SSO
        $form['foo'] = array(
            '#type' => 'button',
            '#value' => t('SSO Log in'),
            '#submit' => array('MODULE_user_login_foo_submit'),
            '#limit_validation_errors' => array(),
        );
        // unset the current default login button of Drupal
        unset ($form['actions']['submit']);
  }
}

function MODULE_user_login_foo_submit($form, &$form_state) {
  drupal_goto('PATH/TO/SSO-SERVER-LOGIN-PAGE.ASPX', array('external' => TRUE));
}
4
AjitS

Drupal_goto()を呼び出す前に宛先を設定解除します。

unset($_GET['destination']);
drupal_goto('PATH/TO/SSO-SERVER-LOGIN-PAGE.ASPX', array('external' => TRUE));

別のオプションは、リダイレクトロジックを自分でコーディングすることです(Dave here が回答として持ち出した)。

drupal_goto() が指定されたパスを宛先で上書きしているため、後者が外部でない場合に問題が発生します(関数コードを確認してください)。

さらに:

ボタンタイプを使用しているため、送信ハンドラは呼び出されていません( documentation )。私のソリューションが機能するためには、タイプを「送信」に変更するか、リダイレクトロジックを検証ハンドラーに移動する必要があります(「#submit」を「#validate」に変更することにより)。

4
Madis
//implements hook_form_alter()
function MODULE_form_alter(&$form, $form_state, $form_id) {
  if ($form_id == 'user_login_block' || $form_id == 'user_login') {
    $form['#action'] = 'PATH/TO/SSO-SERVER-LOGIN-PAGE.ASPX';
  }
}
2
AjitS