Вопрос или проблема
Как я могу использовать код, чтобы ограничить пользователей в обмене своими идентификаторами и паролями и во входе в систему несколько раз? Что я хочу сделать, так это не позволять пользователю входить в систему несколько раз одновременно.
Это выйдет пользователя из всех других сеансов перед входом. ВEssentially гарантируя, что пользователю будет разрешен только один сеанс одновременно.
add_filter('authenticate', 'wpse_12282015_single_login_authenticate', 0, 3);
function wpse_12282015_single_login_authenticate($user, $username, $password) {
$user = get_user_by('login', $username);
if( isset($user->ID) ){
if(isset($user->roles) && is_array($user->roles)) {
//проверить на наличие администраторов
if(in_array('administrator', $user->roles)) {
// администратору можно входить в систему несколько раз
return $user;
}
}
// получить все сеансы для пользователя
$sessions = WP_Session_Tokens::get_instance($user->ID);
// уничтожить все, поскольку мы скоро будем входить в систему
$sessions->destroy_all();
}
return $user;
}
$sessions = WP_Session_Tokens::get_instance( $user->ID );
if ( $user->ID === get_current_user_id() ) {
$sessions->destroy_others( wp_get_session_token() );
$message = __( 'Вы теперь вышли из системы везде.' );
} else {
$sessions->destroy_all();
/* переводчики: %s: Отображаемое имя пользователя. */
$message = sprintf( __( '%s был выведен из системы.' ), $user->display_name );
}
Основная проблема здесь в том, что HTTP не имеет сеансов, и поэтому вам нужно ввести какое-то начало и окончание сеанса на более высоком уровне. То, как WordPress определяет сеансы, составляет 2 дня после входа в систему или до выхода из системы.
Проблема в том, что пользователи очень редко выходят из WordPress, что означает, что как только пользователь вошел в систему, невозможно использовать его аккаунт с другого компьютера или даже с другого браузера на том же компьютере в течение 2 дней, даже если это тот же пользователь, пытающийся получить доступ снова.
Итак, дьявол здесь в деталях: как вы собираетесь предотвратить продолжение сеансов входа бесконечно, возможно, за счет UX, или как пользователь может “закрыть” сеанс из другого браузера. Ответ Роберта (и Отто) абсолютно неверен, вы можете сделать это, используя существующие хуки, но наивные подходы (например, установить временный код, когда пользователь входит в систему) вероятно приведут к катастрофе с удобством использования.
Для всех, кто попадает на эту страницу в поисках ответа, есть этот плагин, который делает именно это: https://wordpress.org/support/plugin/loggedin/
Возрождая старую тему, потому что WordPress теперь имеет однострочное решение для этой проблемы
просто вызовите эту функцию в хук инициализации вашего плагина (или аналогичном)
wp_destroy_all_sessions()
Ссылка: https://developer.wordpress.org/reference/functions/wp_destroy_all_sessions/
Другие ответы не дают достаточного контекста о том, когда использовать функцию wp_destroy_all_sessions()
, а ответ jgraup позволяет входить в систему без пароля.
Я хотел уничтожить все другие сеансы пользователя, кроме последнего (текущего), и только для неадминистраторов.
// Разрешить только один сеанс пользователя одновременно.
add_action('wp_login', function () {
if (!current_user_can('administrator')) {
// Уничтожить другие сеансы пользователя.
$userId = get_current_user_id();
$sessions = get_user_meta( $userId, 'session_tokens', true ); // Массив токенов сеансов для этого пользователя.
$sessions = array_slice($sessions, -1); // Оставить только последний сеанс.
update_user_meta( $userId, 'session_tokens', $sessions ); // Сохранить обновленный массив сеансов обратно в метаданные пользователя.
return;
}
});
Этот код использует хук входа в систему, чтобы извлечь сеанс текущего пользователя из метаданных пользователя, укоротить все, кроме последнего (самого недавнего), а затем сохранить сеансы обратно в метаданные пользователя. См.: Функция членства: Ограничение пользователей до одного активного сеанса в WordPress.
От Отто.
Не легко. Понадобится довольно много взломов.
WordPress не знает, кто “вошел в систему” в данный момент, потому что нет системы для отслеживания этого любым способом. Когда вы входите в систему, куки устанавливаются в вашем браузере с вашим именем пользователя и кодом, представляющим ваш пароль. Каждый раз, когда вы получаете доступ к сайту, эти куки проверяются, и вас идентифицируют как вас.
Таким образом, вы не поддерживаете постоянное соединение или используете какой-то вид сеанса. Вы “входите в систему” каждый раз, когда заходите на сайт для чего-либо.
Чтобы сделать то, что вы хотите, вам придется переписать много системы входа и аутентификации, чтобы использовать сеансы или что-то подобное.
По умолчанию в WordPress нет такой системы для хранения сеансов в базе данных.
Ответ или решение
Как ограничить пользователей в одновременном входе в систему в WordPress?
Проблема разрешения пользователям входить в систему под одними и теми же учетными данными в нескольких сеансах представляет собой важный аспект безопасности в веб-разработке. Одной из наиболее распространенных платформ для создания сайтов является WordPress, которая, хотя и обладает мощными средствами аутентификации, изначально не поддерживает механизм отслеживания сессий пользователя. В этом руководстве мы рассмотрим, как реализовать ограничение на один сеанс пользователя.
1. Что такое сессия в WordPress?
WordPress использует систему аутентификации, основанную на cookies. При входе пользователя в систему создается cookie с идентификатором пользователя и кодом, представляющим его пароль. Каждый раз, когда пользователь обращается к сайту, этот cookie проверяется для идентификации пользователя. Это обозначает, что WordPress не поддерживает концепцию постоянного подключения к сессии.
2. Почему возникает необходимость ограничить одновременные сессии?
Одновременные сессии могут привести к потенциальной утечке личной информации, несанкционированному доступу и другим нарушениям безопасности. Особенно это актуально для пользователей с высокими правами доступа, таких как администраторы. Поэтому многие веб-мастера ищут способы, как гарантировать, что пользователь может быть активным только в одном сеансе.
3. Реализация ограничения одного сеанса
Чтобы ограничить пользователя входить в систему под одной й той же учетной записью, можно воспользоваться хуками WordPress и функцией для работы с сессиями.
Пример кода
В примере ниже показано, как можно реализовать данную функциональность с помощью фильтра authenticate
и некоторых встроенных функций WordPress:
add_filter('authenticate', 'single_login_authenticate', 0, 3);
function single_login_authenticate($user, $username, $password) {
$user = get_user_by('login', $username);
if (isset($user->ID)) {
// Проверка на роль пользователя
if (isset($user->roles) && is_array($user->roles)) {
if (in_array('administrator', $user->roles)) {
// Администраторы могут входить несколько раз
return $user;
}
}
// Получение всех сессий пользователя
$sessions = WP_Session_Tokens::get_instance($user->ID);
// Уничтожение всех сессий перед новым входом
$sessions->destroy_all();
}
return $user;
}
Уточнение по коду
В коде выше мы:
- Получаем пользователя по его имени.
- Проверяем, если пользователь является администратором, то разрешаем ему несколько сессий.
- Для других пользователей получаем все сессии и уничтожаем все активные перед новым входом.
4. Плюсы и минусы
Плюсы:
- Повышенная безопасность для пользователей.
- Уменьшение случаев несанкционированного доступа.
Минусы:
- Ухудшение пользовательского опыта, особенно если пользователь забывает выходить из системы.
- Возможно, придется обратить внимание на управление сессиями для пользователей, которые могут использовать несколько устройств.
5. Альтернативные решения
Если описанный выше метод не устраивает, вы можете использовать существующие плагины, такие как Logged In, который предоставляет функциональность для управления сессиями пользователей. Также, начиная с версии WordPress 4.6, введена функция wp_destroy_all_sessions()
, позволяющая легко уничтожить все активные сессии пользователя.
Заключение
Ограничение на вход в систему является важной практикой для управления безопасностью и обеспечением контроля над доступом. Используя приведенные методы и подходы, вы можете эффективно реализовать эту функциональность на своем сайте на WordPress. Всегда следите за обновлениями WordPress и учитывайте изменяющиеся нужды ваших пользователей для достижения наилучших результатов.