web-dev-qa-db-ger.com

Ersetzen der Wordpress-Kennwortüberprüfung

Ich habe eine benutzerdefinierte Anwendung mit Tausenden von Benutzern, die bereits ein Kennwort gespeichert haben. Ich möchte eine selbst gehostete WordPress-Site einrichten, um diese Anwendung zu begleiten und die Benutzernamen und verschlüsselten Passwörter zu verwenden, die bereits in dieser Datenbank existieren.

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

Wir haben ein Entwicklerteam. Wenn es also eine Möglichkeit gäbe, Code zu schreiben, um sich in den Anmeldevorgang einzubinden, wäre dies akzeptabel. Hat jemand Erfahrung damit oder irgendwelche Vorschläge, wo man suchen soll?

5
Steve Stedman

Wenn wir den Filter authenticate untersuchen, können wir feststellen, dass er inside die Funktion wp_authenticate heißt, die eine steckbare Funktion ist.

Das bedeutet, dass es durch ein von uns hergestelltes Produkt ersetzt werden kann.

Dies ist die ursprüngliche Funktion plus einem 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', __('<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;
}

Der Test wurde durchgeführt Erstellen einer wp_authenticate Funktion innerhalb eines Must Use Plugins . An diesem Einstiegspunkt setze ich Folgendes:

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 Testtabelle, Passwort ist sogar Klartext.
demo user table


Die Sache ist, wie das $user-Objekt vollständig auf einer benutzerdefinierten Tabelle basiert. Oder wenn es machbar oder ratsam ist ...

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


Hinweise :

Diese Antwort geht nicht über die Analyse und das Hacken der Funktion wp_authenticate hinaus. Die Sicherheit, die Kennwortverwaltung und die Tabelle wp_usermeta werden nicht berücksichtigt.

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] => [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

Tatsächlich können Sie den Anmeldemechanismus von WordPress automatisch umgehen, indem Sie sich als Benutzer anmelden (nachdem die Anmeldeinformationen beispielsweise von einer anderen Website erfolgreich übermittelt wurden).

zum Beispiel melden Sie sich mit admin an (Benutzer mit id = 1)

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

sie können also einen Benutzer in WordPress mit festgelegten Benutzerrechten erstellen und ihn dann als Benutzerprotokoll mit anderen Anmeldeinformationen als diesen "Platzhalter" -Benutzer protokollieren.

6
Roman

Einfachste Methode

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

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

Ich denke, dieses Plugin External Database Authentication passt zu Ihren Bedürfnissen. Von dort aus können Sie bereits angemeldete Benutzer aktivieren, die das Cookie setzen, wenn sie sich nur mit wp_set_auth_cookie anmelden, wie @Roman sagt.

0
grosshat