Проверка пароля пользователя
Я хочу проверить, имеет ли пользователь определенный пароль, поэтому я пытался использовать wp_check_password, но аккаунт, для которого выполняется проверка, выходит из системы и не может войти снова, пока в коде присутствует вызов wp_check_password.
Копаясь в коде, я обнаружил, что функция устанавливает пароль, используя новый хеш. Более того, если я использую wp_check_password( 'hello', md5('hello'), 1 );, она даже не проверяет, что находится в базе данных, и возвращает true. Разве это не ошибка?
Есть ли идеи, как я могу проверить пароль пользователя?
Ваш пример работает корректно. Вы проверяете, соответствует ли пароль hello хешу hello — что естественно верно.
Не до конца продумал. Ваш пример вызывает следующую проблему:
- Вы проверяете, соответствует ли
hellomd5 от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
@goldenapples не имеет смысла переопределять wp_hash_password() и оставлять без изменений wp_check_password(). Несовпадение хешей просто не позволит пройти проверку, верно? :)
Rarst
О, ты прав. wp_check_password() будет работать так, как ты использовал её в своём ответе. Я говорил про его исходный вопрос — проверку 'hello' против md5 от 'hello', которая не сработает, если md5 не является алгоритмом, используемым в wp_hash_password...
goldenapples
@goldenapples нативная функция wp_hash_password() действительно поддерживает md5 для обратной совместимости, она перехэширует такие пароли при проверке. Теперь, когда я об этом задумался, скорее всего в исходном вопросе проблема именно в этом...
Rarst
Да, если два введенных пароля совпадают при использовании md5, wp_check_password сбросит пароль пользователя, используя текущую хэш-функцию. Поэтому в исходном вопросе, так как введенные пароли совпадали, он менял пароль пользователя на "hello"...
goldenapples
@Rarst Спасибо! Это работает. А я все думал, почему мне нужно самому передавать хэш. Это сделано для поддержания обратной совместимости, верно? Иначе достаточно было бы просто пароля для проверки и ID.
Ashfame
@Ashfame функции, связанные с паролями, намеренно сделаны подключаемыми и очень гибкими, чтобы люди могли легко создавать или интегрировать альтернативные схемы аутентификации.
Rarst
@Rarst То есть это сделано для обеспечения возможности подключения, а не для поддержания обратной совместимости с разными хешами?
Ashfame
@Ashfame обратная совместимость есть только с md5, потому что именно это использовалось в WordPress в прошлом.
Rarst
Вы можете получить хешированный пароль пользователя из базы данных и сравнить его с введённым значением, используя функцию 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 ) ) Странно! Спасибо за помощь!
Ashfame
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