token_cache_service.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. """
  2. SSO Token 内存缓存服务
  3. 缓存 token → 用户信息映射,减少对 SSO 中心的请求压力。
  4. 支持可配置的 TTL 过期策略。
  5. """
  6. import time
  7. import threading
  8. from dataclasses import dataclass, field
  9. from typing import Dict, Any, Optional
  10. @dataclass
  11. class CacheEntry:
  12. """缓存条目,包含用户信息和创建时间"""
  13. user_info: Dict[str, Any]
  14. created_at: float = field(default_factory=time.time)
  15. def is_expired(self, ttl: float) -> bool:
  16. """检查缓存条目是否已过期"""
  17. return (time.time() - self.created_at) > ttl
  18. class TokenCacheService:
  19. """
  20. SSO Token 内存缓存服务
  21. 通过缓存 token → 用户信息的映射,避免每次 API 请求都调用 SSO 中心验证。
  22. 缓存条目在 TTL 过期后自动失效,下次访问时会被清除。
  23. """
  24. def __init__(self, ttl_seconds: int = 300):
  25. """
  26. Args:
  27. ttl_seconds: 缓存过期时间(秒),默认 300 秒(5 分钟)
  28. """
  29. self._cache: Dict[str, CacheEntry] = {}
  30. self._ttl = ttl_seconds
  31. self._lock = threading.Lock()
  32. def get(self, token: str) -> Optional[Dict[str, Any]]:
  33. """
  34. 查询缓存,返回用户信息或 None。
  35. 如果缓存条目已过期,自动删除并返回 None。
  36. Args:
  37. token: SSO access_token
  38. Returns:
  39. 用户信息字典,或 None(未命中/已过期)
  40. """
  41. with self._lock:
  42. entry = self._cache.get(token)
  43. if entry is None:
  44. return None
  45. if entry.is_expired(self._ttl):
  46. del self._cache[token]
  47. return None
  48. return entry.user_info
  49. def set(self, token: str, user_info: Dict[str, Any]) -> None:
  50. """
  51. 写入缓存。
  52. Args:
  53. token: SSO access_token
  54. user_info: 用户信息字典
  55. """
  56. with self._lock:
  57. self._cache[token] = CacheEntry(user_info=user_info)
  58. def invalidate(self, token: str) -> None:
  59. """
  60. 使指定 token 的缓存失效。
  61. Args:
  62. token: SSO access_token
  63. """
  64. with self._lock:
  65. self._cache.pop(token, None)
  66. def clear(self) -> None:
  67. """清空所有缓存"""
  68. with self._lock:
  69. self._cache.clear()