Можно ли программно авторизовать пользователя без пароля?

28 мая 2012 г., 16:13:10
Просмотры: 118K
Голосов: 51

Я программно создаю пользователей вручную и хочу авторизовать только что созданного пользователя. WordPress позволяет легко получить хешированный пароль, но не его текстовую версию. Есть ли способ использовать wp_signon() без текстового пароля?

Я нашел одного человека, который утверждает, что сделал это здесь, но у меня это не сработало.

СПАСИБО!

1
Комментарии

Думаю, можно просто присвоить объект пользователя, которого вы только что создали, глобальной переменной current_user

onetrickpony onetrickpony
28 мая 2012 г. 16:27:58
Все ответы на вопрос 7
4
66

Следующий код выполняет автоматический вход без использования пароля!

// Автоматический вход //
$username = "Admin";
$user = get_user_by('login', $username );

// URL для перенаправления //
if ( !is_wp_error( $user ) )
{
    wp_clear_auth_cookie();
    wp_set_current_user ( $user->ID );
    wp_set_auth_cookie  ( $user->ID );

    $redirect_to = user_admin_url();
    wp_safe_redirect( $redirect_to );
    exit();
}
3 янв. 2014 г. 15:21:12
Комментарии

Отлично работает. Достаточно только имени пользователя, причем оно не чувствительно к регистру.

shasi kanth shasi kanth
6 февр. 2014 г. 09:50:52

get_user_by() возвращает false в случае неудачи, поэтому следует проверять на false, а не на объект WP_Error

somebodysomewhere somebodysomewhere
14 апр. 2016 г. 23:41:21

@Sjoerd Linders, куда можно подключить ваш скрипт, чтобы принудительно требовать подключения пользователя?

RafaSashi RafaSashi
31 авг. 2016 г. 19:45:14

Где мне разместить этот блок кода и в каком файле?

sgiri sgiri
28 мая 2019 г. 10:32:51
4
43

wp_set_auth_cookie() позволяет авторизовать пользователя без необходимости знать его пароль.

28 мая 2012 г. 16:25:39
Комментарии

Это отлично сработало. Однако, когда я использую это, условная функция is_user_logged_in() не работает, кажется. Вы знаете, может она проверяет что-то другое, а не куки?

emersonthis emersonthis
28 мая 2012 г. 16:44:12

@Emerson - на каком хуке вы выполняете вход пользователя? Это должно происходить до отправки заголовков. Также попробуйте использовать wp_set_current_user перед входом пользователя.

Milo Milo
28 мая 2012 г. 16:47:31

Вообще-то я не вызывал это из хука. Я просто добавил wp_set_auth_cookie() в свою функцию входа. Пожалуй, мне нужно переосмыслить этот подход. Я также посмотрю wp_set_current_user и отпишусь. Большое спасибо за вашу помощь в этом вопросе!

emersonthis emersonthis
28 мая 2012 г. 16:59:58

Ну, а можно ли войти пользователя без наличия его данных в базе данных? Достаточно ли просто установить несколько куки в браузере через скрипт? Пожалуйста, дайте знать.

shasi kanth shasi kanth
6 февр. 2014 г. 11:10:41
5
15

Я нашел другое решение здесь, которое использует более правильный подход (по крайней мере, на мой взгляд...).

Нет необходимости устанавливать какие-либо куки, оно использует WordPress API:

/**
 * Программный вход пользователя в систему
 * 
 * @param string $username
 * @return bool Возвращает true, если вход выполнен успешно; false в противном случае
 */
function programmatic_login( $username ) {
    if ( is_user_logged_in() ) {
        wp_logout();
    }

    add_filter( 'authenticate', 'allow_programmatic_login', 10, 3 );    // Подключаем фильтр раньше других обработчиков
    $user = wp_signon( array( 'user_login' => $username ) );
    remove_filter( 'authenticate', 'allow_programmatic_login', 10, 3 );

    if ( is_a( $user, 'WP_User' ) ) {
        wp_set_current_user( $user->ID, $user->user_login );

        if ( is_user_logged_in() ) {
            return true;
        }
    }

    return false;
}

/**
 * Callback-функция фильтра 'authenticate', которая авторизует пользователя только по имени.
 *
 * Чтобы избежать потенциальных уязвимостей безопасности, этот метод должен использоваться только
 * в контексте программного входа и должен быть отключен сразу после выполнения.
 * 
 * @param WP_User $user
 * @param string $username
 * @param string $password
 * @return bool|WP_User Возвращает объект WP_User, если пользователь найден, или false в противном случае
 */
function allow_programmatic_login( $user, $username, $password ) {
    return get_user_by( 'login', $username );
}

Думаю, код говорит сам за себя:

Фильтр ищет объект WP_User по указанному имени пользователя и возвращает его. Затем вызывается функция wp_set_current_user с объектом WP_User, возвращенным wp_signon, проверка с помощью функции is_user_logged_in, чтобы убедиться, что вход выполнен, и все!

На мой взгляд, это аккуратный и чистый код!

31 июл. 2014 г. 17:56:52
Комментарии

где использовать programmatic_login?

RafaSashi RafaSashi
31 авг. 2016 г. 19:50:13

Идеальный ответ!

Maximus Maximus
9 июл. 2017 г. 02:05:15

@Shebo Ваш комментарий, кажется, неверен. Первая строка функции проверяет, пуст ли массив $credentials или нет. Если массив не пуст (как в моем ответе), то значения из массива используются для аутентификации пользователя.

Mike Mike
4 сент. 2017 г. 12:17:55

@Mike Вау, как я это пропустил... Моя вина, извини за введение в заблуждение. Я удалю свой первый комментарий, чтобы избежать путаницы. Отличное решение, кстати :)

Shebo Shebo
4 сент. 2017 г. 14:49:46

Возможно, стоит обернуть wp_signon() в блок try и вызвать remove_filter в блоке finally. Это гарантирует, что фильтр всегда будет удален.

Leukipp Leukipp
23 июл. 2020 г. 06:35:30
1
10

Это хорошо работает для меня:

  clean_user_cache($user->ID); // Очищаем кеш пользователя
  wp_clear_auth_cookie();      // Удаляем аутентификационные куки
  wp_set_current_user($user->ID); // Устанавливаем текущего пользователя
  wp_set_auth_cookie($user->ID, true, false); // Устанавливаем новые аутентификационные куки
  update_user_caches($user);   // Обновляем кеш пользователя
10 июн. 2015 г. 02:25:23
Комментарии

Эта полезная статья объясняет, почему это необходимо: https://tommcfarlin.com/wordpress-user-caches/

Alex Alex
9 мар. 2023 г. 11:53:13
0

В дополнение к Майку, Полу и Сьёрду:

Для лучшей обработки перенаправлений в login.php:

//---------------------Автоматический вход--------------------

if(!is_user_logged_in()){

    $username = "user1";

    if($user=get_user_by('login',$username)){

        clean_user_cache($user->ID);

        wp_clear_auth_cookie();
        wp_set_current_user( $user->ID );
        wp_set_auth_cookie( $user->ID , true, false);

        update_user_caches($user);

        if(is_user_logged_in()){

            $redirect_to = user_admin_url();
            wp_safe_redirect( $redirect_to );
            exit;
        }
    }
}
elseif('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] == wp_login_url()){

    $redirect_to = user_admin_url();
    wp_safe_redirect( $redirect_to );
    exit;
}

Данный код следует разместить в wp-config.php сразу после

require_once(ABSPATH . 'wp-settings.php');

Для сведения

На основе приведённого решения я выпустил плагин для поддержания входа пользователя из одного WordPress в другой путём синхронизации данных пользователя и сессии cookie:

https://wordpress.org/plugins/user-session-synchronizer/

31 авг. 2016 г. 20:37:10
1

Как ни странно, но у меня работает только если сделать редирект и die() после:

clean_user_cache($user->ID);
wp_clear_auth_cookie();
wp_set_current_user( $user_id, $user->user_login );
wp_set_auth_cookie( $user_id, true, true );
update_user_caches( $user );

if ( is_user_logged_in() ) {

    $redirect_to = $_SERVER['REQUEST_URI'];
    header("location:".$redirect_to );
    die(); 

}
22 мая 2020 г. 08:36:01
Комментарии

Вы можете установить переменную $redirect_to на любую существующую страницу вашего сайта. Например: $redirect_to = site_url();

Marcelo Viana Marcelo Viana
25 февр. 2021 г. 19:32:14
0

Я считаю, что это правильный путь. Нам следует очистить кеш пользователя и куки. После входа в систему необходимо вызвать хук wp_login, чтобы другие плагины и основные функции работали совместно.

$user = get_user_by( 'ID', $user_id ); // Получаем объект WP_User по ID пользователя.
// $user = get_user_by( 'email', $email ); // Или получаем по email.
// $user = get_user_by( 'login', $username ); // Или получаем по имени пользователя.

if ( false !== $user ) {
    clean_user_cache( $user->ID ); // Очищаем кеш пользователя
    wp_clear_auth_cookie(); // Удаляем куки аутентификации
    wp_set_current_user( $user->ID, $user->user_login ); // Устанавливаем текущего пользователя
    wp_set_auth_cookie( $user->ID ); // Устанавливаем куки аутентификации
    update_user_caches( $user ); // Обновляем кеши пользователя
    do_action( 'wp_login', $user->user_login, $user ); // Вызываем хук wp_login
}
13 янв. 2024 г. 16:56:10