如何使 django 用户处于非活动状态并使他们的所有会话无效
How to make a django user inactive and invalidate all their sessions
为了使用户不活跃,我通常这样做:
User.objects.get(pk=X).update(is_active=False)
但是,这不会注销用户或执行任何与会话相关的操作。 django 中是否有内置功能可以使用户立即处于非活动状态,或者实现此目的的最佳方法是什么?
一个类似的答案是这样的:,但如果有数百万个会话(这是一种遍历所有会话的蛮力方式),则效果不佳。虽然这是从 2009 年开始的,但希望今天有更好的方法。
如上所述,您可以使用 django-user-session or django-qsessions. But these include some other metadata such as user agent and ip address, and you may not want these for some reason. Then you need to write your custom session backend
我稍微调整了示例并创建了一个满足我需要的示例。
session_backend.py:
from django.contrib.auth import get_user_model
from django.contrib.sessions.backends.db import SessionStore as DBStore
from django.contrib.sessions.base_session import AbstractBaseSession
from django.db import models
User = get_user_model()
class QuickSession(AbstractBaseSession):
# Custom session model which stores user foreignkey to asssociate sessions with particular users.
user = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
@classmethod
def get_session_store_class(cls):
return SessionStore
class SessionStore(DBStore):
@classmethod
def get_model_class(cls):
return QuickSession
def create_model_instance(self, data):
obj = super().create_model_instance(data)
try:
user_id = int(data.get('_auth_user_id'))
user = User.objects.get(pk=user_id)
except (ValueError, TypeError, User.DoesNotExist):
user = None
obj.user = user
return obj
并在 settings.py 中:
SESSION_ENGINE = 'path.to.session_backend'
要删除用户的所有会话:
from session_backend import QuickSession
QuickSession.objects.filter(user=request.user).delete()
您可以为用户模型编写自定义保存方法以自动删除所有会话
对于用户,如果 is_active 字段设置为 False。
请记住,未登录的用户字段将为 NULL。
自 Django 2.2 版以来,更改用户密码会使所有用户会话失效。 (这无需扫描整个会话 table。密码字段的 HMAC 在登录时保存,并且在访问 request.user
的任何请求中,登录会话被视为 no-longer-valid如果当前 HMAC 不匹配。)
https://docs.djangoproject.com/en/2.2/topics/auth/default/#session-invalidation-on-password-change-1
user = User.objects.get(pk=user_id)
user.is_active = False
user.set_unusable_password()
user.save()
为了使用户不活跃,我通常这样做:
User.objects.get(pk=X).update(is_active=False)
但是,这不会注销用户或执行任何与会话相关的操作。 django 中是否有内置功能可以使用户立即处于非活动状态,或者实现此目的的最佳方法是什么?
一个类似的答案是这样的:,但如果有数百万个会话(这是一种遍历所有会话的蛮力方式),则效果不佳。虽然这是从 2009 年开始的,但希望今天有更好的方法。
如上所述,您可以使用 django-user-session or django-qsessions. But these include some other metadata such as user agent and ip address, and you may not want these for some reason. Then you need to write your custom session backend
我稍微调整了示例并创建了一个满足我需要的示例。
session_backend.py:
from django.contrib.auth import get_user_model
from django.contrib.sessions.backends.db import SessionStore as DBStore
from django.contrib.sessions.base_session import AbstractBaseSession
from django.db import models
User = get_user_model()
class QuickSession(AbstractBaseSession):
# Custom session model which stores user foreignkey to asssociate sessions with particular users.
user = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
@classmethod
def get_session_store_class(cls):
return SessionStore
class SessionStore(DBStore):
@classmethod
def get_model_class(cls):
return QuickSession
def create_model_instance(self, data):
obj = super().create_model_instance(data)
try:
user_id = int(data.get('_auth_user_id'))
user = User.objects.get(pk=user_id)
except (ValueError, TypeError, User.DoesNotExist):
user = None
obj.user = user
return obj
并在 settings.py 中:
SESSION_ENGINE = 'path.to.session_backend'
要删除用户的所有会话:
from session_backend import QuickSession
QuickSession.objects.filter(user=request.user).delete()
您可以为用户模型编写自定义保存方法以自动删除所有会话 对于用户,如果 is_active 字段设置为 False。
请记住,未登录的用户字段将为 NULL。
自 Django 2.2 版以来,更改用户密码会使所有用户会话失效。 (这无需扫描整个会话 table。密码字段的 HMAC 在登录时保存,并且在访问 request.user
的任何请求中,登录会话被视为 no-longer-valid如果当前 HMAC 不匹配。)
https://docs.djangoproject.com/en/2.2/topics/auth/default/#session-invalidation-on-password-change-1
user = User.objects.get(pk=user_id)
user.is_active = False
user.set_unusable_password()
user.save()