Django Как запретить нескольким пользователям входить в систему с одинаковыми учетными данными - PullRequest
7 голосов
/ 07 декабря 2011

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

Это должно предотвратить несколько входов на разных компьютерах с использованием одного имени пользователя и пароля.Как мне добиться этого в Django?

Мы должны помнить следующее:

  1. Если пользователь закрывает браузер без выхода из системы
  2. Если время сеансаout

Ответы [ 3 ]

5 голосов
/ 19 декабря 2015

Вы можете попробовать это, он выходит из системы первого пользователя и входит во второго.Добавьте middleware.py в каталог приложения (того же уровня, что и модели, виды и т. Д.) И добавьте этот код.Полезно, когда один и тот же человек использует более одного устройства.Убедитесь, что вы добавили это в ваши классы промежуточного программного обеспечения: 'myapp.middleware.UserRestrict',

class UserRestrict(object):
    def process_request(self, request):
        """
        Checks if different session exists for user and deletes it.
        """
        if request.user.is_authenticated():
            cache = get_cache('default')
            cache_timeout = 86400
            cache_key = "user_pk_%s_restrict" % request.user.pk
            cache_value = cache.get(cache_key)

            if cache_value is not None:
                if request.session.session_key != cache_value:
                    engine = import_module(settings.SESSION_ENGINE)
                    session = engine.SessionStore(session_key=cache_value)
                    session.delete()
                    cache.set(cache_key, request.session.session_key, 
                              cache_timeout)
            else:
                cache.set(cache_key, request.session.session_key, cache_timeout)
2 голосов
/ 07 декабря 2011

Из коробки Django не предоставляет вам способа предотвратить одновременные сеансы для одной и той же учетной записи пользователя, и это не тривиальная вещь. Тем не менее, вот еще один вопрос с некоторыми предложениями о том, как вы могли бы сделать это: Как я могу обнаружить несколько входов в веб-приложение Django из разных мест?

1 голос
/ 29 июня 2015

я решаю проблему с новой моделью, пользовательским декоратором и пользовательской страницей входа

1) я создал дополнительную модель для пользователей, например:

class SessionKey(models.Model):
    user = models.OneToOneField(User,primary_key=True)
    key = models.CharField(max_length=255)

2) я создал пользовательскуюДекоратор для проверки сеансового ключа равен или не последний ключ.я изменил исходный исходный код декораторы Django

from functools import wraps
from django.conf import settings
from django.utils.decorators import available_attrs
from django.contrib.auth.decorators import login_required
from django.shortcuts import resolve_url
from users.models import SessionKey #my additional model

def unique_login_required(view_func):
    @wraps(view_func, assigned=available_attrs(view_func))
    def _wrapped_view(request, *args, **kwargs):
        r = False
        ...
        #check session key is equal to last one
        ...
        if r:
            return view_func(request, *args, **kwargs)
        else:
            from django.contrib.auth.views import redirect_to_login
            path = request.build_absolute_uri()
            resolved_login_url = resolve_url(settings.LOGIN_URL)
            return redirect_to_login(path,resolved_login_url)
    return _wrapped_view

3) на пользовательской странице входа, я обновил ключ сеанса.при последнем входе в систему всегда обновляется сохраненный сеансовый ключ.

наконец, в представлениях я вызываю моего декоратора

from users.decorators import unique_login_required
@unique_login_required
def index(request):
...
...