私はすでにパスワードが保存されている何千ものユーザーとカスタムアプリケーションを持っています。私はそのアプリケーションに同行し、そのデータベースにすでに存在するユーザー名と暗号化されたパスワードを使用するために自己ホスト型のワードプレスサイトを設定したいと思います。
通常のユーザーリストを使用せず、代わりに別のサーバー上の別のデータベースに対してユーザー名とパスワードを検証するようにWordpressを設定する方法はありますか?
我々は開発者のチームを持っているので、ログインプロセスにフックするコードを書く方法があればこれは受け入れられるでしょう。誰かがこれを経験したことがありますか、それともどこを見ればよいかについて何か提案がありますか?
フィルター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
は単純なテストテーブルであり、パスワードはプレーンテキストです。
問題は、カスタムテーブルに基づいて$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] =>
)
実際には、この関数を使用すると、ログインユーザーによるワードプレスのログインメカニズムを自動的に回避することができます(たとえば、他のWebサイトからの資格情報を使用して成功した後)。
例えばこれであなたはログインadminをする(id = 1のユーザー)
wp_set_auth_cookie(1); //after this admin is logged in
そのため、指定されたユーザー特権を持つワードプレスでユーザーを作成してから、別の資格情報を使用してログインするユーザーとして、この「プレースホルダー」ユーザーとして彼をログインさせることができます。
最も簡単な方法
add_filter( 'authenticate', 'my_auth', 10, 3 );
function my_auth( $user, $username, $password ){
// your validation here.
return $user;
}
このプラグインは 外部データベース認証 はあなたのニーズに合っていると思います。 @Romanが言っているように、wp_set_auth_cookie
を使ってログインするときに、すでにログインしているユーザーがCookieを設定できるようにします。