Проверка пароля пользователя
Я хочу проверить, имеет ли пользователь определенный пароль, поэтому я пытался использовать wp_check_password
, но аккаунт, для которого выполняется проверка, выходит из системы и не может войти снова, пока в коде присутствует вызов wp_check_password
.
Копаясь в коде, я обнаружил, что функция устанавливает пароль, используя новый хеш. Более того, если я использую wp_check_password( 'hello', md5('hello'), 1 );
, она даже не проверяет, что находится в базе данных, и возвращает true. Разве это не ошибка?
Есть ли идеи, как я могу проверить пароль пользователя?

Ваш пример работает корректно. Вы проверяете, соответствует ли пароль hello
хешу hello
— что естественно верно.
Не до конца продумал. Ваш пример вызывает следующую проблему:
- Вы проверяете, соответствует ли
hello
md5 отhello
(вместо хеша из профиля пользователя). - Они совпадают, и WordPress считает это верным, но устаревшим md5 хешем — который необходимо обновить.
- Он повторно хеширует
hello
и обновляет пользователя этим значением, блокируя его (поскольку теперь его пароль — этоhello
вместо того, что был ранее).
Смотрите функцию wp_authenticate_username_password()
для подробного примера, но основная идея такова:
$userdata = get_user_by('login', $username);
$result = wp_check_password($password, $userdata->user_pass, $userdata->ID);

Но это работает не во всех случаях, что, как я предположил, и было проблемой. Во-первых, функция хеширования пароля является заменяемой (pluggable), поэтому она не обязательно использует md5 (на самом деле, по умолчанию, кажется, используется phpass).

@goldenapples не имеет смысла переопределять wp_hash_password()
и оставлять без изменений wp_check_password()
. Несовпадение хешей просто не позволит пройти проверку, верно? :)

О, ты прав. wp_check_password()
будет работать так, как ты использовал её в своём ответе. Я говорил про его исходный вопрос — проверку 'hello' против md5 от 'hello', которая не сработает, если md5 не является алгоритмом, используемым в wp_hash_password
...

@goldenapples нативная функция wp_hash_password()
действительно поддерживает md5 для обратной совместимости, она перехэширует такие пароли при проверке. Теперь, когда я об этом задумался, скорее всего в исходном вопросе проблема именно в этом...

Да, если два введенных пароля совпадают при использовании md5, wp_check_password сбросит пароль пользователя, используя текущую хэш-функцию. Поэтому в исходном вопросе, так как введенные пароли совпадали, он менял пароль пользователя на "hello"...

@Rarst Спасибо! Это работает. А я все думал, почему мне нужно самому передавать хэш. Это сделано для поддержания обратной совместимости, верно? Иначе достаточно было бы просто пароля для проверки и ID.

@Ashfame функции, связанные с паролями, намеренно сделаны подключаемыми и очень гибкими, чтобы люди могли легко создавать или интегрировать альтернативные схемы аутентификации.

@Rarst То есть это сделано для обеспечения возможности подключения, а не для поддержания обратной совместимости с разными хешами?

@Ashfame обратная совместимость есть только с md5, потому что именно это использовалось в WordPress в прошлом.

Вы можете получить хешированный пароль пользователя из базы данных и сравнить его с введённым значением, используя функцию wp_hash_password().
Чтобы проверить, совпадает ли пароль текущего пользователя со строкой "hello", используйте следующий код:
if ( $current_user->user_pass == wp_hash_password( 'hello' ) )

if ( wp_hash_password( $xx_new_password ) != $xx_userinfo->user_pass )
работает иначе, чем if ( !wp_check_password( $xx_new_password, $xx_userinfo->user_pass , $xx_id ) )
Странно! Спасибо за помощь!

require_once ABSPATH . WPINC . '/class-phpass.php';
$wp_hasher = new PasswordHash(8, TRUE);
$password_hashed = '$P$BB3pP6fQAYa61ael0LNQlpB1NOyqNY0';
$plain_password = 'admin2';
if($wp_hasher->CheckPassword($plain_password, $password_hashed)) {
print 'Пароль совпал.';
}
Кредиты: https://stackoverflow.com/a/37181662
