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
|
||||
|
||||
def get_queryset(self):
|
||||
keys = UserSession.get_keys()
|
||||
keys = user_session_manager.get_keys()
|
||||
queryset = UserSession.objects.filter(key__in=keys)
|
||||
if current_org.is_root():
|
||||
return queryset
|
||||
|
|
|
@ -288,16 +288,9 @@ class UserSession(models.Model):
|
|||
ttl = caches[settings.SESSION_CACHE_ALIAS].ttl(cache_key)
|
||||
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
|
||||
def clear_expired_sessions(cls):
|
||||
keys = cls.get_keys()
|
||||
keys = user_session_manager.get_keys()
|
||||
cls.objects.exclude(key__in=keys).delete()
|
||||
|
||||
class Meta:
|
||||
|
|
|
@ -37,6 +37,9 @@ class RedisUserSessionManager:
|
|||
if new_count <= 0:
|
||||
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):
|
||||
count = self.client.hget(self.JMS_SESSION_KEY, session_key)
|
||||
count = 0 if count is None else int(count.decode('utf-8'))
|
||||
|
@ -52,5 +55,12 @@ class RedisUserSessionManager:
|
|||
session_keys.append(key)
|
||||
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()
|
||||
|
|
|
@ -13,8 +13,9 @@ from audits.models import UserSession
|
|||
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.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.sessions.cache import user_session_manager
|
||||
from common.utils import get_logger
|
||||
from jumpserver.utils import get_current_request
|
||||
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'))
|
||||
@register_as_period_task(crontab=CRONTAB_AT_PM_TWO)
|
||||
@register_as_period_task(crontab=CRONTAB_AT_AM_TWO)
|
||||
def clean_expired_user_session_period():
|
||||
UserSession.clear_expired_sessions()
|
||||
|
||||
|
@ -172,4 +173,5 @@ def clean_expired_user_session_period():
|
|||
@receiver(user_logged_out)
|
||||
def user_logged_out_callback(sender, request, user, **kwargs):
|
||||
session_key = request.session.session_key
|
||||
user_session_manager.remove(session_key)
|
||||
UserSession.objects.filter(key=session_key).delete()
|
||||
|
|
Loading…
Reference in New Issue