Вручную подтвердите, что идентификатор сеанса django в данный момент аутентифицирован

#python #django #django-authentication #django-sessions #django-users

#python #django #django-аутентификация #django-сеансы #django-пользователи

Вопрос:

Мне нужно, чтобы функция сообщала мне, аутентифицирован ли идентификатор сеанса Django в данный момент или нет. Я понимаю, что это уже встроено в Django, и у меня это работает просто отлично.

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

С чего мне начать повторное использование некоторых встроенных функций Django 1.2?

Ответ №1:

Вы можете сделать это следующим образом (не тестировалось, но это показывает вам возможный способ):

 from django.utils.importlib import import_module
from django.conf import settings
from django.contrib.auth import get_user
from django.contrib.auth.models import AnonymousUser
from django.contrib.auth import SESSION_KEY, BACKEND_SESSION_KEY, load_backend

engine = import_module(settings.SESSION_ENGINE)
session = engine.SessionStore(YOUR_SESSION_KEY)

try:
    user_id = session[SESSION_KEY]
    backend_path = session[BACKEND_SESSION_KEY]
    backend = load_backend(backend_path)
    user = backend.get_user(user_id) or AnonymousUser()
except KeyError:
    user = AnonymousUser()

if user.is_authenticated():
    print "User"
else:
    print "Guest"
  

Комментарии:

1. ‘YOUR_SESSION_KEY’ используется перед блоком try / except , так что разве это не завершилось бы полным сбоем, если бы YOUR_SESSION_KEY не существовал?

Ответ №2:

Вот строка в исходном коде, django.contrib.auth.__init__.login которая регистрирует пользователя.

     request.session[SESSION_KEY] = user.id
  

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

 from django.contrib.auth import SESSION_KEY
from django.contrib.sessions.models import Session
try:
    session = Session.objects.get(session_key=my_key)
    session.get_decoded()[SESSION_KEY]
    return (True, "Authenticated")
except (Session.DoesNotExist, KeyError):
    return (False, "Not authenticated")
  

PS: хороший вариант от aeby для извлечения из session engine, если вы не используете сеансы db.

Комментарии:

1. Осторожно: это работает только с хранилищем сеансов, поддерживаемым базой данных. Если вы рассмотрите возможность использования кэша, файла или файла cookie, это не сработает.