web-dev-qa-db-ja.com

ログインページに認証フィールドを追加する

WordPressの認証ページを強化します。私の考えは、ログインページに追加のフィールドを追加するだけです。追加フィールドでは、ユーザーに個人識別コード(4〜8桁)の入力を求めます。

ログインページのレイアウトをwp-login.phpに変更し、個人識別コードをMySQLデータベースに格納するための列を追加しました。

しかし、私は既存のコーディングを参照したいので、コーディングのどの部分がパスワードの検証に使用されているのかわかりません。

どうやってそれを効果的に行うことができますか?

7
nomall

まず第一に、私はコアファイルの編集に反対するは、次にWordPressを更新すると上書きされるためです。

また、WordPressにはセキュリティ更新プログラムが含まれることが多いため、WordPressをshouldする必要があります。 (最近 報告中 古いWordPressバージョンを使用しているサイトへの攻撃が続発している)

実際にやりたいことを達成するために、WordPressを編集する最良の方法として hooks を使用することをお勧めします。

そのため、ログインページに追加のフィールドを作成するには、login_formアクションフックを使用できます。

add_action('login_form','my_added_login_field');
function my_added_login_field(){
    //Output your HTML
?>
    <p>
        <label for="my_extra_field">My extra field<br>
        <input type="text" tabindex="20" size="20" value="" class="input" id="my_extra_field" name="my_extra_field_name"></label>
    </p>
<?php
}

次に、フィールドに入力した内容が保存した内容と一致したことを確認する必要があります。次のコードでは、識別コードをメタキーmy_ident_codeを持つユーザーメタ値として保存していると想定しています。 独自の列を作成するのではなく、これを行う必要があります!。コーデックスのページをご覧ください

ユーザーを確認するには、authenticateフィルターを使用できます。これにより、入力したユーザー名とパスワードが渡されます。識別コードが正しい場合は、nullを返し、WordPressがパスワードとユーザー名を検証できるようにします。正しくない場合は、WordPressの認証を削除してエラーを返します。これにより、ユーザーは強制的にログインページに戻り、エラーが表示されます。

add_filter( 'authenticate', 'my_custom_authenticate', 10, 3 );
function my_custom_authenticate( $user, $username, $password ){
    //Get POSTED value
    $my_value = $_POST['my_extra_field_name'];

    //Get user object
    $user = get_user_by('login', $username );

    //Get stored value
        $stored_value = get_user_meta($user->ID, 'my_ident_code', true);

    if(!$user || empty($my_value) || $my_value !=$stored_value){
        //User note found, or no value entered or doesn't match stored value - don't proceed.
            remove_action('authenticate', 'wp_authenticate_username_password', 20);
            remove_action('authenticate', 'wp_authenticate_email_password', 20); 

        //Create an error to return to user
            return new WP_Error( 'denied', __("<strong>ERROR</strong>: You're unique identifier was invalid.") );
    }

    //Make sure you return null 
    return null;
}
13
Stephen Harris

この回答は参考用です。

あなたはコアファイルのWordPressファイルを編集するべきではありません、さもなければあなたは更新の後あなたの修正を失うでしょう。

/wp-includes/class-phpass.phpファイルの250行目に見られるように、WordPressがログインパスワード確認プロセスをどのように処理するかを以下に示します。

function CheckPassword($password, $stored_hash)
{
    $hash = $this->crypt_private($password, $stored_hash);
    if ($hash[0] == '*')
        $hash = crypt($password, $stored_hash);

    return $hash == $stored_hash;
}
2
Manimaran

すべてのコードを編集するのがちょっと大変なようであれば、これに適したプラグインがあります。

Cimy Extra Fields

あるいは、 Theme My login を使用することでこれを実行できますが、コーディングが必要です。それはまたかなりの追加機能を追加します。あなたは喜んでこれら二つのプラグインを一緒に使うことができます。

0
itsdanprice