web-dev-qa-db-fra.com

Remplacement de validation du mot de passe Wordpress

J'ai une application personnalisée avec des milliers d'utilisateurs qui ont déjà un mot de passe stocké. J'aimerais créer un site wordpress auto-hébergé pour accompagner cette application et utiliser les noms d'utilisateur et les mots de passe cryptés qui existent déjà dans cette base de données.

Existe-t-il un moyen de configurer Wordpress pour ne pas utiliser la liste normale d'utilisateurs, mais pour valider les noms d'utilisateur et les mots de passe par rapport à une autre base de données sur un autre serveur?

Nous avons une équipe de développeurs, donc s’il existait un moyen d’écrire du code à intégrer au processus de connexion, cela serait acceptable. Est-ce que quelqu'un a de l'expérience avec cela, ou a des suggestions sur où chercher?

5
Steve Stedman

En examinant le filtre authenticate, nous pouvons constater qu'il s'appelle inside la fonction wp_authenticate , qui est une fonction connectable .

Cela signifie qu'il peut être remplacé par l'un de nos créateurs.

C'est la fonction d'origine , plus un point d'entrée marqué:

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

Le test a été effectué en créant une fonction wp_authenticate dans un Must Use plugin . Sur ce point d'entrée, j'ai mis le texte suivant:

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

La table wp_my_users est une table de test simple, le mot de passe est même du texte brut.
demo user table


Le sujet est comment construire l'objet $user complètement basé sur une table personnalisée. Ou si c'est faisable ou conseillé ...

Parce que dans ce test, l'ID des utilisateurs est le même, nous redonnons donc à WordPress ( get_user_by ) un utilisateur de sa propre table wp_users, mais avec les informations d'identification vérifiées dans une table personnalisée wp_my_users.


Notes :

Cette réponse ne va pas au-delà de l'analyse et du piratage de la fonction wp_authenticate. La sécurité, la gestion des mots de passe et la table wp_usermeta ne sont pas pris en compte.

Pour référence, ceci est le contenu de $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

En fait, vous pouvez contourner automatiquement le mécanisme de connexion de wordpress par l'utilisateur connecté (après avoir transmis avec succès les informations d'identification d'un autre site Web, par exemple) avec cette fonction: wp_set_auth_cookie ($ user_id);

par exemple avec cela vous vous connectez admin (utilisateur avec id = 1)

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

afin que vous puissiez créer un utilisateur dans wordpress avec des privilèges d'utilisateur spécifiés, puis en tant que journal d'utilisateur avec d'autres informations d'identification, vous pouvez le connecter en tant qu'utilisateur "à espace réservé".

6
Roman

Méthode la plus simple

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

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

Je pense que ce plugin Authentification de base de données externe répond à vos besoins. À partir de là, vous pouvez autoriser les utilisateurs déjà connectés à définir le cookie lorsqu'ils se connectent en utilisant simplement wp_set_auth_cookie, comme le dit @Roman.

0
grosshat