手动验证Django会话ID是否已认证

4 投票
2 回答
5893 浏览
提问于 2025-04-16 12:00

我需要一个功能来告诉我一个Django的会话ID(session-id)是否已经通过认证。其实Django已经内置了这个功能,我已经把它搞定了。

不过,我有一个外部应用程序,它会接收一个会话ID,当这个应用把会话ID的字符串传回给Django时,我需要验证这个会话ID是否有效并且已经通过认证。

我应该从哪里开始使用Django 1.2里的一些内置功能呢?

2 个回答

5

这里有一行代码来自 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")

顺便说一下,aeby 的做法很不错,如果你不使用数据库会话的话,可以从会话引擎中提取信息。

9

你可以这样做(虽然没测试过,但这给你展示了一种可能的方法):

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"

撰写回答