2015-03-31 2 views
0

У меня есть веб-сайт PHP для Google App Engine. У меня есть система регистрации, поэтому пользователь входит в систему и сохраняется в базе данных.Сайт доступен только для определенных устройств

Я хочу иметь возможность сделать это так, чтобы пользователь мог получить доступ только через 2 устройства. Поэтому, если они попытаются войти в систему с помощью третьего устройства, они не будут разрешены. Так, например, пользовательское устройство (IP-адрес или MAC-адрес или что-то еще) сохраняется, и если пользователь пытается войти в систему с помощью устройства, которое не сохранено или не соответствует учетным данным сохраненных устройств, то почему отказ в доступе.

Чтобы сделать его более понятным, пользователь (с именем пользователя i001) имеет мобильный телефон и ноутбук. Таким образом, пользователь может войти на веб-сайт, когда они используют свой мобильный телефон и ноутбук, но нет другого устройства.

Есть ли способ сделать это возможным?

+0

Возможно, возможно хранение информации о сеансе работы в базе данных? Однако это может быть не совсем безупречно. – Maximus2012

+0

Это может сработать. Как я могу сохранить информацию об устройстве из сеанса? – David

+0

Я считаю, что вы можете использовать суперглобальные массивы $ _SERVER и $ _SESSION, чтобы получить уникальные комбинации информации о пользователе/​​устройстве. $ _SERVER предоставит вам браузер и IP-адрес клиента: http://php.net/manual/en/reserved.variables.server.php. Я не думаю, что вы можете получить MAC-адрес и не думайте, что вам это нужно. – Maximus2012

ответ

1

Я имел simliar проблему и решать ее следующим образом в Symfony 2:

Каждый пользователь имеет максимальное количество логинов за то же время, для Вашего случая мы возьмем 2. Также у меня есть поле с указанием того, сколько логинов доступно прямо сейчас.

Таким образом, мы имеем следующую базу данных:

maxLogins|loginsFree 
2  |2 

С каждым входа в систему, идентификатор пользователя, идентификатор сессии и DateTime логина будут сохранены в базе данных. В процессе входа в систему столбцы loginsFree будут уменьшены.

Таким образом, мы имеем следующее:

//After Login 
maxLogins|loginsFree 
2  |1 

Логика проста, чтобы ограничить доступ в пределах входа

if($freeLogins == 0){ 
    //give out an message or something 
} else { 
    //do your login 
} 

Если пользователь регистрируется из вашей системы, loginsFree будет увеличиваться на 1.

//After Logout 
maxLogins|loginsFree 
2  |2 

ВАЖНО

Вы не должны увеличивать значение loginsFree по значению maxLogins, иначе пользователь может зарегистрироваться чаще, а затем 2 раза в одно и то же время.

Кроме того, поскольку я решил эту проблему с сеансом, мне нужен был процесс, который недействительными сессиями после определенного времени бездействия. Те сессии, которые были признаны недействительными, также должны увеличить значение loginsFree, поскольку они забрали логин.

+0

Благодарим вас за подробное объяснение. В этом есть смысл. Сколько полей имело ваша база данных? как выглядит таблица вашей базы данных? – David

+0

@David my Database сохранила идентификатор sessionID, идентификатор пользователя и время последнего действия, которое будет обновляться при каждом действии, которое пользователь делает в этом сеансе. Если Datetime последнего действия старше, то в указанное время сеанс будет признан недействительным – KhorneHoly

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