我尝试查看this answer,以及使用django会话here。
使用我的自定义身份验证登录工作正常,但我想在每个中间件请求上验证令牌,我无法弄清楚如何存储令牌,以便可以从中间件以及中间件访问它视图。
我尝试从我的auth后端存储一个会话变量,但是当我尝试从我的视图中访问它时,我总是会遇到一个关键错误。
有没有好办法呢?
谢谢!
class MyAuthBackend(object):
supports_inactive_user = False
supports_object_permissions = False
supports_anonymous_user = False
def authenticate(self, username=None, password=None):
# This makes a call to my API to varify login, then return token if valid. I need to make login_valid accessible to my middleware and views.
login_valid = auth.login(username,password)
if login_valid:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
user = User(username=username, password='never_used')
user.is_active = True
user.save()
return user
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
class MyAuthMiddleware(object):
def process_request(self, request):
if not request.user.is_anonymous():
# API call to my backend to check if token is still valid. If not, return to login page.
token_variable = ???????????
if isTokenStillValid(token_variable):
return
else:
return HttpResponseRedirect('/accounts/login/?next=%s' % request.path)
答案 0 :(得分:0)
您是否使用默认的django.contrib.auth登录视图进行登录?它似乎在登录过程中完全清除会话(在调用身份验证后端之后发生,在contrib.auth.login函数中,描述为here)。
我认为您可以尝试编写自己的登录视图,使用保留身份验证令牌的备用登录功能,或将令牌存储在其他位置(数据库表,缓存系统)。后者可能难以允许一个用户同时进行多次登录。