mirror of https://github.com/jumpserver/jumpserver
perf: 优化user session 逻辑
parent
e5cb99d682
commit
cfb1d306a3
|
@ -269,7 +269,7 @@ class UserSessionViewSet(CommonApiMixin, viewsets.ModelViewSet):
|
||||||
return user_ids
|
return user_ids
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
keys = UserSession.get_keys()
|
keys = user_session_manager.get_keys()
|
||||||
queryset = UserSession.objects.filter(key__in=keys)
|
queryset = UserSession.objects.filter(key__in=keys)
|
||||||
if current_org.is_root():
|
if current_org.is_root():
|
||||||
return queryset
|
return queryset
|
||||||
|
|
|
@ -288,16 +288,9 @@ class UserSession(models.Model):
|
||||||
ttl = caches[settings.SESSION_CACHE_ALIAS].ttl(cache_key)
|
ttl = caches[settings.SESSION_CACHE_ALIAS].ttl(cache_key)
|
||||||
return timezone.now() + timedelta(seconds=ttl)
|
return timezone.now() + timedelta(seconds=ttl)
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_keys():
|
|
||||||
session_store_cls = import_module(settings.SESSION_ENGINE).SessionStore
|
|
||||||
cache_key_prefix = session_store_cls.cache_key_prefix
|
|
||||||
keys = caches[settings.SESSION_CACHE_ALIAS].iter_keys('*')
|
|
||||||
return [k.replace(cache_key_prefix, '') for k in keys]
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def clear_expired_sessions(cls):
|
def clear_expired_sessions(cls):
|
||||||
keys = cls.get_keys()
|
keys = user_session_manager.get_keys()
|
||||||
cls.objects.exclude(key__in=keys).delete()
|
cls.objects.exclude(key__in=keys).delete()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
@ -37,6 +37,9 @@ class RedisUserSessionManager:
|
||||||
if new_count <= 0:
|
if new_count <= 0:
|
||||||
self.client.hdel(self.JMS_SESSION_KEY, session_key)
|
self.client.hdel(self.JMS_SESSION_KEY, session_key)
|
||||||
|
|
||||||
|
def remove(self, session_key):
|
||||||
|
self.client.hdel(self.JMS_SESSION_KEY, session_key)
|
||||||
|
|
||||||
def check_active(self, session_key):
|
def check_active(self, session_key):
|
||||||
count = self.client.hget(self.JMS_SESSION_KEY, session_key)
|
count = self.client.hget(self.JMS_SESSION_KEY, session_key)
|
||||||
count = 0 if count is None else int(count.decode('utf-8'))
|
count = 0 if count is None else int(count.decode('utf-8'))
|
||||||
|
@ -52,5 +55,12 @@ class RedisUserSessionManager:
|
||||||
session_keys.append(key)
|
session_keys.append(key)
|
||||||
return session_keys
|
return session_keys
|
||||||
|
|
||||||
|
def get_keys(self):
|
||||||
|
session_keys = []
|
||||||
|
for k in self.client.hgetall(self.JMS_SESSION_KEY).keys():
|
||||||
|
key = k.decode('utf-8')
|
||||||
|
session_keys.append(key)
|
||||||
|
return session_keys
|
||||||
|
|
||||||
|
|
||||||
user_session_manager = RedisUserSessionManager()
|
user_session_manager = RedisUserSessionManager()
|
||||||
|
|
|
@ -13,8 +13,9 @@ from audits.models import UserSession
|
||||||
from authentication.backends.oauth2.signals import oauth2_create_or_update_user
|
from authentication.backends.oauth2.signals import oauth2_create_or_update_user
|
||||||
from authentication.backends.oidc.signals import openid_create_or_update_user
|
from authentication.backends.oidc.signals import openid_create_or_update_user
|
||||||
from authentication.backends.saml2.signals import saml2_create_or_update_user
|
from authentication.backends.saml2.signals import saml2_create_or_update_user
|
||||||
from common.const.crontab import CRONTAB_AT_PM_TWO
|
from common.const.crontab import CRONTAB_AT_AM_TWO
|
||||||
from common.decorators import on_transaction_commit
|
from common.decorators import on_transaction_commit
|
||||||
|
from common.sessions.cache import user_session_manager
|
||||||
from common.utils import get_logger
|
from common.utils import get_logger
|
||||||
from jumpserver.utils import get_current_request
|
from jumpserver.utils import get_current_request
|
||||||
from ops.celery.decorator import register_as_period_task
|
from ops.celery.decorator import register_as_period_task
|
||||||
|
@ -164,7 +165,7 @@ def on_openid_create_or_update_user(sender, request, user, created, name, userna
|
||||||
|
|
||||||
|
|
||||||
@shared_task(verbose_name=_('Clean up expired user sessions'))
|
@shared_task(verbose_name=_('Clean up expired user sessions'))
|
||||||
@register_as_period_task(crontab=CRONTAB_AT_PM_TWO)
|
@register_as_period_task(crontab=CRONTAB_AT_AM_TWO)
|
||||||
def clean_expired_user_session_period():
|
def clean_expired_user_session_period():
|
||||||
UserSession.clear_expired_sessions()
|
UserSession.clear_expired_sessions()
|
||||||
|
|
||||||
|
@ -172,4 +173,5 @@ def clean_expired_user_session_period():
|
||||||
@receiver(user_logged_out)
|
@receiver(user_logged_out)
|
||||||
def user_logged_out_callback(sender, request, user, **kwargs):
|
def user_logged_out_callback(sender, request, user, **kwargs):
|
||||||
session_key = request.session.session_key
|
session_key = request.session.session_key
|
||||||
|
user_session_manager.remove(session_key)
|
||||||
UserSession.objects.filter(key=session_key).delete()
|
UserSession.objects.filter(key=session_key).delete()
|
||||||
|
|
Loading…
Reference in New Issue