web-dev-qa-db-ja.com

最初のフォームがユーザーを登録しているにもかかわらず、最後のフォーム検証関数がエラーを渡している

ユーザーを登録してログインするためにuser_external_login_register()を呼び出すカスタムuser_loginフォーム検証関数を記述しましたが、フォームの最後の検証関数はform_set_error()を呼び出します。

フォームの#validate配列は次のようになります。

validate (Array, 4 elements)

    * 0 (String, 32 characters ) vtiger_portal_user_form_validate
    * 1 (String, 24 characters ) user_login_name_validate
    * 2 (String, 32 characters ) user_login_authenticate_validate
    * 3 (String, 25 characters ) user_login_final_validate

user_login_final_validate()は次のとおりです: http://api.drupal.org/api/drupal/modules--user--user.module/function/user_login_final_validate

次にvtiger_portal_user_form_validate()のコードとそれが呼び出す認証関数を示します。

function vtiger_portal_user_form_validate($form, &$form_state) {
  if (!vtiger_portal_authenticate($form_state)) {
    // Not a portal user. Let the other validation handlers run.
  } else {
    global $user;
    if($user->uid) {
      dpm($user);
    }
  }
}

/**
 * Custom user authentication function
 */
function vtiger_portal_authenticate($form_state) {  
  $username = $form_state['input']['name'];
  $password = $form_state['input']['pass'];
  $testname = drupal_substr(drupal_strtolower($username),0,4);
  if ($testname == "dave") {
    user_external_login_register($username, 'vtiger_portal');
    return TRUE;
  } else {
    return FALSE;
  }
}

「申し訳ありませんが、認識できないユーザー名またはパスワード。パスワードを忘れましたか?」と表示されます。エラーと同時にログインに成功しました。user_external_login_register()を呼び出した後に$ userオブジェクトを出力しましたが、uidが9であることを示しています.

ユーザーが明らかに正常にログインしたときに、user_login_final_validate()からエラーが表示される理由を誰かが理解できるようにできますか?

更新:問題の根源を見つけました。

2121行目から、user.moduleには次のコードが含まれています。

// We are not limited by flood control, so try to authenticate.
// Set $form_state['uid'] as a flag for user_login_final_validate().
$form_state['uid'] = user_authenticate($form_state['values']['name'], $password);

user_login_authenticate_validate()は$ form_state ['uid']をFALSEに設定して、後でuser_login_final_validate()がエラーメッセージを送信するようにします。

1
Arosboro

OPが誤ってD7ではなくD6からuser_login_final_validate()を貼り付けました。 D7では、$form_state['uid'] = [a number]を設定するだけでそのエラーメッセージを回避できます。これは、カスタム#validateコールバック内から行います。これを実行すると、user_login_final_validate()はエラーをスローせず、フォームの送信が続行され、ログインが続行されます。

2
moshe weitzman

user_login_authenticate_validate() 関数が実際にユーザーをログインさせるように見えます。回避策は、user_login_authenticate_validate()コールバックの設定を解除して、 user_authenticate() from vtiger_portal_authenticate()追加の検証を実行した後。

user_login_authenticate_validate()コールバックの設定を解除するには、hook_form_alter()を実装する必要があります。

vtiger_form_alter(&$form, $form_state, $form_id) {
  if ($form_id == 'user_login') {
    $key = array_search('user_login_authenticate_validate', $form['#validate']);
    if ($key !== FALSE) {
      unset($form['#validate'][$key]);
    }
  }
}
0
jhedstrom