web-dev-qa-db-fra.com

Est-il possible d'avoir un utilisateur avec juste le champ mot de passe?

J'ai essayé de faire quelque chose comme ça:

$user = $wpdb->get_row('
    SELECT * 
    FROM ' . $wpdb->users . ' 
    WHERE user_pass = "' . wp_hash_password('password') . '"'
);

Mais la fonction wp_hash_password génère une chaîne différente de celle de la base de données, est-ce possible?

Ce que j'aimerais faire, c'est avoir un formulaire personnalisé dans mon modèle qui demande simplement un mot de passe (pensez-le comme l'écran de nom d'utilisateur/pwd à la zone WP admin sans le nom d'utilisateur) quelle que soit l'entrée, comparez-la avec ma base de données et, si elle correspond, prenez cet utilisateur et connectez-le.

2
Javier Villanueva

Voici ce que j'ai fini par faire au cas où quelqu'un aurait besoin d'une fonctionnalité similaire:

// Simple text password
$client_password = $_POST['client_pwd'];

$users = get_users();

// Iterate over all users and see if the password matches
foreach ($users as $user) {
    // If it matches log the user in
    if (wp_check_password($client_password, $user->user_pass)) {
        $user = wp_signon(
            array(
                'user_login'    => $user->user_login,
                'user_password' => $client_password
            )
        );

        if (!is_wp_error($user)) {
            // Redirect or do something else
        }
    }
}
0
Javier Villanueva

Le mot de passe n'est pas unique tout le temps.

Selon les statistiques de worst password, password est le mot de passe le plus utilisé de tous les temps.

Je suis sûr que certains de vos utilisateurs utilisent également ce mot de passe.

Donc, plusieurs lignes contiendront le même hachage. Par conséquent, ce n'est pas possible.

Au fait, c'est une question étrange.

enter image description here

10
Giri

D'après les commentaires, je vais répondre à une question paraphrasée - "Comment créer un formulaire de connexion qui affiche uniquement le champ du mot de passe dans la plupart des cas".

La solution consiste à stocker le nom d'utilisateur dans un cookie à très long terme (un an?) Chaque fois que l'utilisateur se connecte.

function wpse82578_set_user_cookie($logged_in_cookie, $expire, $expiration, $user_id, $state) {
  if ($state == 'logged_in') { // user has logged in - store his name in a 'username' cookie
    $user = get_user_by( 'id', $user_id );
    setcookie('username', $user->user_login, time() + 365*24*60*60, COOKIEPATH, COOKIE_DOMAIN);
  }
}
add_action('set_logged_in_cookie', 10,5);

Maintenant, dans votre code PHP, vous pouvez vérifier si le cookie est défini et afficher ou masquer le champ du nom d'utilisateur dans votre formulaire.

function wpse82578_echo_login_form() {
   ...
   if (isset($_COOKIE['username'])) { // already know the user name, no point in asking for it again so just put it as hidden field
     <input type="hidden" name="log" value="<?php esc_attr($_COOKIE['username'])?> />
   else { // show the field+label, ripped from wp_login_form
        <p class="login-username">
            <label for="' . esc_attr( $args['id_username'] ) . '">' . esc_html( $args['label_username'] ) . '</label>
            <input type="text" name="log" id="' . esc_attr( $args['id_username'] ) . '" class="input" value="' . esc_attr( $args['value_username'] ) . '" size="20" tabindex="10" />
        </p>
    }
}

Aucune garantie pour ce code, mais je pense que c'est la meilleure approximation de ce que vous voulez sans sacrifier la sécurité et sans jouer avec le système utilisateur WordPress.

3
Mark Kaplun