web-dev-qa-db-ja.com

Wordpressのパスワード検証を置き換える

私はすでにパスワードが保存されている何千ものユーザーとカスタムアプリケーションを持っています。私はそのアプリケーションに同行し、そのデータベースにすでに存在するユーザー名と暗号化されたパスワードを使用するために自己ホスト型のワードプレスサイトを設定したいと思います。

通常のユーザーリストを使用せず、代わりに別のサーバー上の別のデータベースに対してユーザー名とパスワードを検証するようにWordpressを設定する方法はありますか?

我々は開発者のチームを持っているので、ログインプロセスにフックするコードを書く方法があればこれは受け入れられるでしょう。誰かがこれを経験したことがありますか、それともどこを見ればよいかについて何か提案がありますか?

5
Steve Stedman

フィルターauthenticateを調べると、それが inside 関数 wp_authenticate と呼ばれることがわかります。これは プラガブル関数 です。

つまり、それは私たち自身の作るものに置き換えることができるということです。

これは、元の関数と、マークされたエントリポイントです:

function wp_authenticate($username, $password) {
    $username = sanitize_user($username);
    $password = trim($password);

    $user = apply_filters('authenticate', null, $username, $password);

    /* ENTRY POINT */

    if ( $user == null ) {
        // TODO what should the error message be? (Or would these even happen?)
        // Only needed if all authentication handlers fail to return anything.
        $user = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));
    }

    $ignore_codes = array('empty_username', 'empty_password');

    if (is_wp_error($user) && !in_array($user->get_error_code(), $ignore_codes) ) {
        do_action('wp_login_failed', $username);
    }

    return $user;
}

テストが完了しましたMust Use plugin 内にwp_authenticate関数を作成しました。そのエントリポイントに、以下を配置します。

global $wpdb;
$table = $wpdb->prefix . 'my_users';
$parent = $wpdb->get_row( 
    $wpdb->prepare( 
        "SELECT * FROM $table WHERE name='$username'"
    )
);
if( $username == $parent->name && $password == $parent->password )
    $user = get_user_by( 'id', $parent->id );

テーブルwp_my_usersは単純なテストテーブルであり、パスワードはプレーンテキストです。
demo user table


問題は、カスタムテーブルに基づいて$userオブジェクトを完全に構築する方法です。または、実行可能または推奨される場合...

このテストではユーザーのIDが同じであるため、( get_user_by )をWordPressに独自のテーブルwp_usersのユーザーに返していますが、認証情報はカスタムテーブルwp_my_users


この答えは、関数wp_authenticateの分析とハッキングにとどまりません。セキュリティ、パスワード管理、およびwp_usermetaテーブルについては考慮されていません。

参考までに、これは$userの内容です。

user  |  WP_User Object
(
    [data] => stdClass Object
        (
            [ID] => 1
            [user_login] => rod
            [user_pass] => $P$BQ8qnb3iYPRzisxYHUKq5X/GCQqhoz1
            [user_nicename] => rod
            [user_email] => [email protected]
            [user_url] => 
            [user_registered] => 2012-09-21 14:39:01
            [user_activation_key] => 
            [user_status] => 0
            [display_name] => rod
        )

    [ID] => 1
    [caps] => Array
        (
            [administrator] => 1
        )

    [cap_key] => wp_capabilities
    [roles] => Array
        (
            [0] => administrator
        )

    [allcaps] => Array
        (
            [switch_themes] => 1
            [edit_themes] => 1
            [activate_plugins] => 1
            [edit_plugins] => 1
            [edit_users] => 1
            [edit_files] => 1
            [manage_options] => 1
            [moderate_comments] => 1
            [manage_categories] => 1
            [manage_links] => 1
            [upload_files] => 1
            [import] => 1
            [unfiltered_html] => 1
            [edit_posts] => 1
            [edit_others_posts] => 1
            [edit_published_posts] => 1
            [publish_posts] => 1
            [edit_pages] => 1
            [read] => 1
            [level_10] => 1
            [level_9] => 1
            [level_8] => 1
            [level_7] => 1
            [level_6] => 1
            [level_5] => 1
            [level_4] => 1
            [level_3] => 1
            [level_2] => 1
            [level_1] => 1
            [level_0] => 1
            [edit_others_pages] => 1
            [edit_published_pages] => 1
            [publish_pages] => 1
            [delete_pages] => 1
            [delete_others_pages] => 1
            [delete_published_pages] => 1
            [delete_posts] => 1
            [delete_others_posts] => 1
            [delete_published_posts] => 1
            [delete_private_posts] => 1
            [edit_private_posts] => 1
            [read_private_posts] => 1
            [delete_private_pages] => 1
            [edit_private_pages] => 1
            [read_private_pages] => 1
            [delete_users] => 1
            [create_users] => 1
            [unfiltered_upload] => 1
            [edit_dashboard] => 1
            [update_plugins] => 1
            [delete_plugins] => 1
            [install_plugins] => 1
            [update_themes] => 1
            [install_themes] => 1
            [update_core] => 1
            [list_users] => 1
            [remove_users] => 1
            [add_users] => 1
            [promote_users] => 1
            [edit_theme_options] => 1
            [delete_themes] => 1
            [export] => 1
            [administrator] => 1
        )

    [filter] => 
)
3
brasofilo

実際には、この関数を使用すると、ログインユーザーによるワードプレスのログインメカニズムを自動的に回避することができます(たとえば、他のWebサイトからの資格情報を使用して成功した後)。

例えばこれであなたはログインadminをする(id = 1のユーザー)

wp_set_auth_cookie(1); //after this admin is logged in

そのため、指定されたユーザー特権を持つワードプレスでユーザーを作成してから、別の資格情報を使用してログインするユーザーとして、この「プレースホルダー」ユーザーとして彼をログインさせることができます。

6
Roman

最も簡単な方法

add_filter( 'authenticate', 'my_auth', 10, 3 );

function my_auth( $user, $username, $password ){
    // your validation here.
    return $user;
}
1
Butuzov

このプラグインは 外部データベース認証 はあなたのニーズに合っていると思います。 @Romanが言っているように、wp_set_auth_cookieを使ってログインするときに、すでにログインしているユーザーがCookieを設定できるようにします。

0
grosshat