Можно ли разрешить только один одновременный вход для пользователя в приложении django? если да, как вы подходите?Разрешить только один одновременный вход для каждого пользователя в приложении django
ответ
Этот вопрос в основном отвечает here (stackoverflow.com).
Я собираюсь предположить, что вы имеете в виду вход в систему сразу, а не один «логин» в одно и то же время.
Я еще никогда не писал приложение Django. Но один из методов, который я использовал на других языках, заключается в том, чтобы сохранить идентификатор сеанса зарегистрированного пользователя в своей строке пользователя в базе данных.
Например, если у вас есть таблица пользователей в вашей базе данных, добавьте поле «session_id», а затем, когда пользователь войдет в систему, установите его в свой текущий session_id. На каждой загрузке страницы проверьте, соответствует ли текущий сеанс сеансу session_id в таблице users. Помните, когда вы обновляете свой session_id в своем приложении, вам необходимо обновить базу данных, чтобы они не выходили из системы.
Некоторые люди, когда пользователь входит в систему, просто сохраняют все данные пользователей в сеансе и никогда не переадресуют базу данных при загрузке новой страницы. Поэтому для некоторых этот «лишний» SQL-запрос может показаться неправильным. Для меня я всегда делаю новый запрос на каждую загрузку страницы, чтобы повторно аутентифицировать пользователя и убедиться, что их учетная запись не была удалена/приостановлена и чтобы их комбинация имени пользователя и пароля осталась прежней. (Что, если кто-то из другого места изменил пароль или администратор?)
Вам необходимо создать некоторую модель, которая сохраняет 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()
Хорошая работа, проверить суть, которую я сделал на основе вашего фрагмента: https://gist.github.com/peterdemin/5829440 Моя реализация не использует сигналы – peterdemin
Я нуждался в этом в своих приложениях, так что я создал django package, который теперь на PyPI (ПГИ установить Джанго-preventconcurrentlogins).
Пакет основан на фрагменте peterdemin в: https://gist.github.com/peterdemin/5829440
Надеется, что это помогает кто-то в будущем.
- 1. Разрешить только один логин для каждого пользователя за один раз
- 2. Rails и Authlogic: разрешить только один сеанс для каждого пользователя?
- 3. Ограничить одновременный вход
- 4. Разрешить только один PHPSESSID для пользователя
- 5. Parse.com - разрешить только один сеанс для пользователя
- 6. Разрешить только один экземпляр модели в Django
- 7. Django. Ограничьте каждого пользователя только голосованием один раз
- 8. Следует ли подключать базу данных только один раз в приложении django или один раз для каждого пользователя в views.py?
- 9. Разрешить только один пользовательский вход в Spring Sercurity
- 10. Один длительный процесс для каждого пользователя в приложении ASP.NET Core
- 11. Как предотвратить одновременный вход в систему одного пользователя с Firebase?
- 12. Как предотвратить одновременный вход пользователя в PHP/MySQL?
- 13. Простой способ разрешить только один элемент для каждого пользователя в массиве схемы mongoose
- 14. Ограничить только один сеанс для каждого пользователя в ASP.NET
- 15. Разрешить ввод числа только один раз на вход
- 16. Как разрешить вход пользователя java
- 17. Метеор: разрешить только один экземпляр клиента для пользователя
- 18. Разрешить отправку формы только один раз в день django
- 19. для каждого только один раз
- 20. Страница профиля Django для каждого пользователя
- 21. Продайте цифровой контент в приложении только один раз для каждого пользователя
- 22. Несколько, одновременный Oauth в Rails-приложении?
- 23. Вход пользователя Django через api
- 24. Показать Magnific-всплывающее окно только один раз для каждого пользователя
- 25. нагрузки Javascript только один раз для каждого пользователя/сессии браузера
- 26. Разрешить только один UIButton
- 27. Textarea в приложении iOS cordova принимает вход только один раз
- 28. создал только один вход для нескольких значений в ng-repeat
- 29. Вход в Django только с использованием имени пользователя и хэша
- 30. Вход пользователя django unittesting неавторизован
У связанного ответа stackoverflow есть дополнительное требование, которое следует предотвратить только входам из разных IP-адресов, что не применяется к этому вопросу. Лучшим вопросом для ссылки будет http://stackoverflow.com/questions/8408823/django-how-to-prevent-multiple-users-login-using-the-sredetials – tobltobs