Django 2.1.7 получить сессионный ключ - PullRequest
0 голосов
/ 13 февраля 2019

Я знаю, что это возможный дубликат поста, я нашел решение для этого, но эти посты принадлежат более ранним версиям Django, и я не могу получить новый синтаксис.Может кто-нибудь дать мне совет, пожалуйста?

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

После auth.authenticate (бла-бла):

    if user is not None:
                # Checks if there's any other active session with the same account
                for session in Session.objects.filter(session_key=request.session.session_key): # //aq
                    data = session.get_decoded()
                    print(data.get('_auth_user_id', None))
                    if data.get('_auth_user_id', None) == str(user.id):
                    session.delete()

Но что-то не работает с этим синтаксисом.Я не могу получить идентификатор пользователя сеанса.Когда пользователь входит в систему, я использую request.session['logueado'] = user.id и auth.login(request, user).

Это должно быть похоже на систему «последний, кто войдет в систему».

РЕДАКТИРОВАТЬ: Весь код:

def login(request):
    if 'logged' in request.session:
        return redirect(main)
    if request.method == "GET":
        form = LoginForm
        return render(request, "login.html", {"form": form})
    if request.method == "POST":
        print('POST method.')
        form = LoginForm(request.POST)
        if form.is_valid():
            print('Valid form.')
            user_name = form.cleaned_data.get('username')
            user_pass = form.cleaned_data.get('password')
            user = auth.authenticate(username=user_name, password=user_pass)
            if user is not None:
                for session in Session.objects.filter(session_key=request.session.session_key):
                    print('Hello')
                    data = session.get_decoded()
                    if data.get('_auth_user_id', None) == request.session.session_key:
                        print('Same account in more than 1 session.')
                        session.delete()
                #------------------------------------------------------------------
                request.session['logged'] = user.id
                print(request.session['logged'])
                auth.login(request, user)
                request.session.set_expiry(0) #
                return redirect(main)
            else:
                return render(request, "loginError.html", {"form": form})

РЕДАКТИРОВАТЬ: окончательное решение: (Спасибо, Дэниэл Роузман!)

user = auth.authenticate(username=user_name, password=user_pass)
if user is not None:
    # Checks if there's another session with the same acc
    Sessions = Session.objects.all()
    for row in Sessions:
        print(row.get_decoded().get('_auth_user_id'))
            print(user.id)
            if str(row.get_decoded().get("_auth_user_id")) == str(user.id):
                print('Same sessions')
                row.delete()

    request.session['logged'] = user.id

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Как ответил Даниэль Роузман, вы можете перебрать все сессии в БД, декодировать их все и удалить те, которые вам нужны.Но он медленный, особенно если на вашем сайте большой трафик и много сеансов.

Если вам нужно более быстрое решение, вы можете использовать сессионный бэкэнд, который позволяет запрашивать и получать сеансы определенного пользователя.В этих серверных сеансах у сеанса есть внешний ключ для пользователя, поэтому вам не нужно перебирать все объекты сеанса:

Используя эти бэкэнды,Удаление всех сеансов пользователя может быть сделано в одной строке кода:

user.session_set.all().delete()

Отказ от ответственности: Я являюсь автором django-qsessions.

0 голосов
/ 13 февраля 2019

Ваш код основан на всевозможных ложных предположениях.

Ключи сеанса никоим образом не соответствуют идентификаторам входа в систему.И они уникальны: у каждого клиента будет свой ключ, даже если он вошел в систему как один и тот же пользователь.Более того, сеанс явно сбрасывается, когда пользователь входит в систему, поэтому он получает новый ключ.

Другими словами, единственный способ сделать что-то подобное - это перебрать all сеансов в базе данных, декодируйте их и проверьте, равен ли их элемент _auth_user_id идентификатору пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...