手动验证Django会话ID是否已认证
我需要一个功能来告诉我一个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"