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