Drupal認証をSSOサーバーからの認証に置き換えようとしています ここ で説明されているシナリオで。login_block
を変更しようとしています(「ホームページ」および「アクセス拒否」ページ)、およびlogin_block_form
(mysite.com/user/login
)。デフォルトの[ログイン]ボタンをリセットし、[SSOログイン]ボタンに置き換えました、および#submit
でdrupal_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));
}
Drupal_goto()を呼び出す前に宛先を設定解除します。
unset($_GET['destination']);
drupal_goto('PATH/TO/SSO-SERVER-LOGIN-PAGE.ASPX', array('external' => TRUE));
別のオプションは、リダイレクトロジックを自分でコーディングすることです(Dave here が回答として持ち出した)。
drupal_goto() が指定されたパスを宛先で上書きしているため、後者が外部でない場合に問題が発生します(関数コードを確認してください)。
さらに:
ボタンタイプを使用しているため、送信ハンドラは呼び出されていません( documentation )。私のソリューションが機能するためには、タイプを「送信」に変更するか、リダイレクトロジックを検証ハンドラーに移動する必要があります(「#submit」を「#validate」に変更することにより)。
//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';
}
}