diff --git a/apps/audits/api.py b/apps/audits/api.py index 8bdc7e070..93b9d999d 100644 --- a/apps/audits/api.py +++ b/apps/audits/api.py @@ -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 diff --git a/apps/audits/models.py b/apps/audits/models.py index c4b4486a5..512f50bc1 100644 --- a/apps/audits/models.py +++ b/apps/audits/models.py @@ -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: diff --git a/apps/common/sessions/cache.py b/apps/common/sessions/cache.py index 805d6738a..0763c793a 100644 --- a/apps/common/sessions/cache.py +++ b/apps/common/sessions/cache.py @@ -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() diff --git a/apps/users/signal_handlers.py b/apps/users/signal_handlers.py index 8e1f92254..61548b6af 100644 --- a/apps/users/signal_handlers.py +++ b/apps/users/signal_handlers.py @@ -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()