web-dev-qa-db-ja.com

パスワードフィールドだけを持つユーザーを取得することは可能ですか?

私はこのようなことをしてみました:

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

しかし、wp_hash_password関数はデータベースのものとは異なる文字列を生成しますが、可能ですか

私がやりたいのは私のテンプレートにパスワードを要求するだけのカスタムフォームを用意することです(ユーザー名なしのWP admin領域へのusername/pwd画面のように考えてください)。ユーザーが入力したものは何でもハッシュし、それを私のDBと比較し、それが一致すればそのユーザーを取り出してログインします。

2

他の誰かが同様の機能を必要とする場合に備えて、これが私がした結果です。

// 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

パスワードは常に一意ではありません。

worst passwordの統計によると、passwordは最も使用頻度の高いパスワードです。

一部のユーザーもそのパスワードを使用していると確信しています。

そのため、複数の行に同じハッシュが含まれます。それ故それは不可能である。

ところで、これは奇妙な質問です。

enter image description here

10
Giri

コメントごとに、私は言い換えた質問に答えるつもりです - 「ほとんどの場合パスワードフィールドだけを示すログインフォームを作る方法」。

答えは、ユーザーがログインするたびに、ユーザー名を非常に長期のCookie(1年?)に保存することです。

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

これであなたはPHPコードでクッキーが設定されているかどうかをチェックしてあなたのフォームのユーザー名フィールドを表示または非表示にすることができます。

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

このコードに対する保証はありませんが、セキュリティを犠牲にしたり、WordPressユーザーシステムに迷惑をかけたりすることなく、あなたが望むものに最も近いと思います。

3
Mark Kaplun