2009-11-29 4 views

ответ

3

Этот вопрос в основном отвечает here (stackoverflow.com).

+0

У связанного ответа stackoverflow есть дополнительное требование, которое следует предотвратить только входам из разных IP-адресов, что не применяется к этому вопросу. Лучшим вопросом для ссылки будет http://stackoverflow.com/questions/8408823/django-how-to-prevent-multiple-users-login-using-the-sredetials – tobltobs

0

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

Я еще никогда не писал приложение Django. Но один из методов, который я использовал на других языках, заключается в том, чтобы сохранить идентификатор сеанса зарегистрированного пользователя в своей строке пользователя в базе данных.

Например, если у вас есть таблица пользователей в вашей базе данных, добавьте поле «session_id», а затем, когда пользователь войдет в систему, установите его в свой текущий session_id. На каждой загрузке страницы проверьте, соответствует ли текущий сеанс сеансу session_id в таблице users. Помните, когда вы обновляете свой session_id в своем приложении, вам необходимо обновить базу данных, чтобы они не выходили из системы.

Некоторые люди, когда пользователь входит в систему, просто сохраняют все данные пользователей в сеансе и никогда не переадресуют базу данных при загрузке новой страницы. Поэтому для некоторых этот «лишний» SQL-запрос может показаться неправильным. Для меня я всегда делаю новый запрос на каждую загрузку страницы, чтобы повторно аутентифицировать пользователя и убедиться, что их учетная запись не была удалена/приостановлена ​​и чтобы их комбинация имени пользователя и пароля осталась прежней. (Что, если кто-то из другого места изменил пароль или администратор?)

3

Вам необходимо создать некоторую модель, которая сохраняет session_key для каждого пользователя И создать промежуточное программное обеспечение, которое проверяет ключ сеанса в этой модели для каждого пользователя - если он не равен запросу.session_key - чем удалять этот сеанс (= logout user, позволяя только ток остаться)

#models.py 
class Visitor(model.model): 
    user = models.OneToOneField(User) 
    session_key = models.CharField(null=True, blank=True) 

#and you need to setup signal catching from User model - so for each User Visitor is created 

#middleware.py 
class OnlyOneUserMiddleware(object): 
    def process_request(self, request): 
     cur_session_key = request.user.visitor.session_key 
     if cur_session_key and cur_session_key != request.session.session_key: 
      Session.objects.get(session_key=cur_session_key).delete() 
     #the following can be optimized(do not save each time if value not changed) 
     request.user.visitor.session_key = request.session.session_key 
     request.user.visitor.save() 
+1

Хорошая работа, проверить суть, которую я сделал на основе вашего фрагмента: https://gist.github.com/peterdemin/5829440 Моя реализация не использует сигналы – peterdemin

5

Я нуждался в этом в своих приложениях, так что я создал django package, который теперь на PyPI (ПГИ установить Джанго-preventconcurrentlogins).

Пакет основан на фрагменте peterdemin в: https://gist.github.com/peterdemin/5829440

Надеется, что это помогает кто-то в будущем.

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