Ersetzen der WordPress-Passwort-validation

Ich habe eine benutzerdefinierte Anwendung mit Tausenden von Benutzern, die bereits ein Passwort gespeichert haben. Ich möchte eine selbst gehostete WordPress-Site einrichten, die diese Anwendung begleitet und die Benutzernamen und verschlüsselten Passwörter verwendet, die bereits in dieser database existieren.

Gibt es eine Möglichkeit, WordPress so zu konfigurieren, dass nicht die normale Liste von Benutzern verwendet wird, sondern Benutzernamen und Kennwörter für eine andere database auf einem anderen Server überprüft werden?

Wir haben ein Team von Entwicklern. Wenn es also eine Möglichkeit gäbe, Code zu schreiben, der in den Login-process eingebunden wird, wäre das akzeptabel. Hat jemand Erfahrung damit, oder haben Sie Vorschläge, wo Sie suchen?

Solutions Collecting From Web of "Ersetzen der WordPress-Passwort-validation"

wp_authenticate wir die Filterauthentifizierung untersuchen, können wir feststellen, dass sie in der function wp_authenticate , die eine Pluggable-function ist .

Das bedeutet, dass es von einem unserer eigenen ersetzt werden kann.

Dies ist die ursprüngliche function plus einen markierten Einstiegspunkt:

 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', __('ERROR: 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; } 

Der Test wurde durchgeführt, indem eine wp_authenticate function innerhalb eines Must Use-Plugins erstellt wurde . An diesem Einstiegspunkt habe ich folgendes geschrieben:

 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 ); 

Die Tabelle wp_my_users ist eine einfache wp_my_users , das Passwort ist sogar wp_my_users Text.
Demo-Benutzertabelle


Die Sache besteht darin, das $user Objekt vollständig auf einer benutzerdefinierten Tabelle aufzubauen. Oder wenn es machbar oder ratsam ist …

Da in diesem Test die ID der Benutzer identisch ist, geben wir WordPress einen Benutzer aus seiner eigenen Tabelle wp_users zurück ( get_user_by ), aber mit Anmeldeinformationen, die in einer benutzerdefinierten Tabelle wp_my_users überprüft wp_my_users .


Anmerkungen :

Diese Antwort geht nicht über die Analyse und das Hacken der function wp_authenticate . Sicherheit, Passwortverwaltung und die Tabelle wp_usermeta werden nicht wp_usermeta .

Als Referenz ist dies der Inhalt von $user :

 user | WP_User Object ( [data] => stdClass Object ( [ID] => 1 [user_login] => rod [user_pass] => $P$BQ8qnb3iYPRzisxYHUKq5X/GCQqhoz1 [user_nicename] => rod [user_email] => name@email.com [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] => ) 

Tatsächlich können Sie den Login-Mechanismus von WordPress durch den Login-Benutzer automatisch umgehen (nachdem er erfolgreich mit Anmeldeinformationen von einer anderen Website zum Beispiel übergeben wurde) mit dieser function: wp_set_auth_cookie ($ user_id);

Zum Beispiel mit diesem Login Login Admin (Benutzer mit ID = 1)

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

Sie können also einen Benutzer in WordPress mit den angegebenen Benutzerberechtigungen erstellen und dann als Benutzer mit anderen Anmeldeinformationen einloggen und ihn als “Platzhalter” -Benutzer anmelden.

Einfachste Methode

 add_filter( 'authenticate', 'my_auth', 10, 3 ); function my_auth( $user, $username, $password ){ // your validation here. return $user; } 

Ich denke, dass dieses Plugin externe database-Authentifizierung Ihren Bedürfnissen entspricht. Von dort aus können Sie bereits angemeldete Benutzer aktivieren, die den Cookie setzen, wenn sie sich nur mit wp_set_auth_cookie anmelden, wie @Roman sagt.