我正在 django admin 中构建一个表单,我可以在其中提交用户 ID,系统预计会将用户注销。
我无法做到
django.contrib.auth.logout()
,因为它不接受用户 ID 作为参数。
我也无法查询
django.contrib.sessions.models.Session
,因为我正在使用 django.contrib.sessions.backends.cache
会话引擎。
我能找到实现这一目标的唯一方法是做类似的事情
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()