使用缓存会话后端时如何注销任何用户?

问题描述 投票:0回答:1

我正在 django admin 中构建一个表单,我可以在其中提交用户 ID,系统预计会将用户注销。

我无法做到

django.contrib.auth.logout()
,因为它不接受用户 ID 作为参数。

我也无法查询

django.contrib.sessions.models.Session
,因为我正在使用
django.contrib.sessions.backends.cache
会话引擎。

django session django-admin logout django-sessions
1个回答
0
投票

我能找到实现这一目标的唯一方法是做类似的事情

from django.conf import settings
SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
SessionStore(session_id).delete()

您可能会注意到,我没有将用户 ID 连接到会话 ID 的代码。这是因为据我所知,默认情况下使用缓存会话引擎无法进行该链接,因为会话密钥仅存储在浏览器上。 密钥是一个安全的随机字符串,并且它由后端查找

因此,您需要将会话 ID 存储在数据库中的某个位置,并将该密钥与您的用户相关联。

就我而言,我在登录时向用户发出一组令牌,因此我能够将会话 ID 附加到令牌。然后,当我启动管理操作来强制注销用户时,我可以这样做

for token in Token.objects.filter(user=request.user):
    SessionStore(token.session_id).delete()
    token.delete()
© www.soinside.com 2019 - 2024. All rights reserved.