2015-09-08 3 views
3

Есть ли способ предотвратить открытие пользователем сайта Meteor на двух вкладках или в браузерах?Метеор: разрешить только один экземпляр клиента для пользователя

Я пытаюсь создать карточную игру в Метеор, и я хотел бы «поймать», если пользователь попытается открыть страницу на другой вкладке или в браузере и просто предупредит его, что другой клиентский экземпляр уже открыт и может дать у него/нее возможность выхода из системы во всех случаях и т. д.

Я уже поступил в Google, но не повезло.

ответ

5

Если пользователи должны войти в систему:

  • Сохранить подключение к Connections коллекции, наряду с идентификатором пользователя. (Или RoomID к самому профилю, в зависимости от схемы)
  • Удалить соединение на разъединение
  • на каждом новом соединении см, если идентификатор пользователя уже существует в Connections коллекции

Если пользователи не должны войти:

  • Сохранить подключение к Connections коллекции (наряду с пользовательским IP)
  • Удалить соединение на разъединение
  • на каждом новом подключении см, если IP-адрес уже существует в Connections коллекции

Пример использования OnConnection в дикой природе (заметьте, я не запрещаю несколько соединений, но это было бы просто еще один 5 строк кода): https://github.com/mattkrick/react-tac-toe/blob/master/server/gameState.jsx#L13

Документах (т.е. как захватить IP-адрес): http://docs.meteor.com/#/full/meteor_onconnection

+0

Awesome. Благодаря! –

+0

Достаточно ли IP? Не могут ли пользователи иметь один и тот же IP-адрес, если они совместно используют маршрутизатор или некоторые из них? Я использовал ваше предложение и объединил его с mizzao: пользовательский статус, предложенный Майклом ниже, и он сохраняет/удаляет в/из коллекции Connections просто отлично. Теперь я пытаюсь выяснить, как заставить второе соединение выйти из системы и перейти на специальную страницу объяснений? –

+0

у вас не будет столкновения IP с 2 уникальными устройствами (очень редкие исключения заканчиваются из пространства ipv4 или используют концентратор для репликации пакетов на все устройства). что может произойти, одно и то же устройство дважды обращается к серверу (например, 2 вкладки открыты). Если это произойдет, просто следуйте за номером № 3. проверьте таблицу для ip-адреса. если он существует, перенаправите страницу объяснения & return. –

1

Там очень удобный пакет для отслеживания IP-адреса и сессий на различных устройствах: mizzao:user-status. Это добавляет ключ к документу пользователя (который вам нужно будет публиковать на клиенте), подробно описывая их подключения, независимо от того, активны они или нет, IP-адрес, даже пользовательский агент. Вы даже можете наблюдать изменения этого ключа, чтобы обнаружить с первого сеанса, что пользователь также подключил второй сеанс или наоборот.

+1

Да, я уже использую этот пакет для обработки онлайн-пользователей, однако он показывает только «онлайн: истина», и если пользователь просто открывает другую вкладку или другой браузер, IP то же самое, онлайн-флаг остается верным, изменяется только дата последнего входа ..., который может измениться, если он просто обновил страницу ... поэтому моя проблема заключается в том, в какой момент нужно проверить флаг «онлайн: истина» в другое знать, является ли это двойным соединением или просто обновлением? –

+0

@ Michel: Я смиренно прошу вас рассказать о том, что спросил Предраг в комментарии выше. Я хочу, чтобы для пользователя было открыто только одно соединение, поэтому оно должно запретить мне открывать сайт на другой вкладке или в другом браузере. какие-либо предложения? –

+1

На сервере смотрите коллекцию UserStatus - он имеет один документ для активного соединения. Вы можете реализовать обратный вызов при входе в систему 'UserStatus.events.on (« connectionLogin », ....', который ищет коллекцию UserStatus для текущего пользователя. Если вы найдете его/ее более одного раза, тогда примите меры. –

0

Как MichelFloyd предлагает в чате выше. Я следовал его инструкциям и пробовал все ниже.

Добавить пакет с помощью

$ метеор добавить mizzao: пользовательский статус

Код:

Accounts.onLogin(function(user){ 
    UserStatus.events.on("connectionLogin", function(fields) { 
    $count = UserStatus.connections.find({userId : fields.userId}).count(); 
    console.log('Total log ins : ' + $count); 
    }); 
}); 
  1. Когда я открыл несколько браузера после входа в систему, счет пошел когда я закрывал браузеры один за другим, счет продолжал уменьшаться.
  2. Вы можете использовать этот счет для мониторинга количества пользователей, входивших в систему.

Вы можете follow here просмотреть весь сценарий.

Смежные вопросы