fix: 修复会话鉴权「登录后 token 无效」并补齐 NAS 部署流程
- deps.py: _create_redis_client 增加同步 ping 校验,Redis 不可达时正确降级为内存模式 - main.py: lifespan 复用 deps 的 UserStore 单例,避免 admin 与 API 请求实例不一致 - 前端: 强制改密弹窗(must_change_password 用户)、兼容新旧登录返回格式、markPasswordChanged - 新增 NAS SSH 部署脚本与批处理测试;gitignore 前端构建产物
This commit is contained in:
+12
-2
@@ -8,6 +8,7 @@ UserStore/SessionStore 为模块级懒加载单例:Redis 客户端创建失败
|
||||
import structlog
|
||||
from fastapi import Depends, Header
|
||||
from redis import asyncio as redis_async
|
||||
from redis import Redis as RedisSync
|
||||
|
||||
from app.api.response import ApiError
|
||||
from app.config import settings
|
||||
@@ -22,11 +23,20 @@ _session_store: SessionStore | None = None
|
||||
|
||||
|
||||
def _create_redis_client() -> redis_async.Redis | None:
|
||||
"""创建 redis.asyncio 客户端(decode_responses=True);失败返回 None 走内存降级"""
|
||||
"""创建 redis.asyncio 客户端(decode_responses=True);连接失败返回 None 走内存降级
|
||||
|
||||
注意:redis.asyncio.from_url() 仅构造客户端对象,不会实际连接 Redis,
|
||||
因此需要用同步客户端 ping 一次确认连接可用,否则后续操作才会报错,
|
||||
导致 UserStore/SessionStore 无法降级为内存模式。
|
||||
"""
|
||||
try:
|
||||
# 同步 ping 确认 Redis 可达(from_url 不会实际连接)
|
||||
sync_client = RedisSync.from_url(settings.redis_url, decode_responses=True)
|
||||
sync_client.ping()
|
||||
sync_client.close()
|
||||
return redis_async.from_url(settings.redis_url, decode_responses=True)
|
||||
except Exception:
|
||||
logger.warning("Redis 客户端创建失败,认证存储降级为内存模式", exc_info=True)
|
||||
logger.warning("Redis 连接失败,认证存储降级为内存模式", exc_info=True)
|
||||
return None
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user