Files
GameServerManager/docs/IMPLEMENTATION_SUMMARY.md
2026-02-13 12:21:07 +08:00

10 KiB
Raw Permalink Blame History

HTTP 安全警告和令牌管理功能实现总结

实现的功能

1. 登录页 HTTP 安全警告

文件: client/src/pages/LoginPage.tsx

功能:

  • 检测用户是否使用 HTTP 协议访问面板
  • 首次访问时自动弹出安全警告模态框(带淡入淡出动画)
  • 常驻显示"环境不安全"按钮(左上角,带慢速脉冲动画)
  • 点击"环境不安全"按钮可随时查看安全警告详情
  • 警告内容包括:
    • HTTP 访问的安全风险说明(数据传输未加密、凭证可能被截获等)
    • 安全建议(配置 HTTPS、仅在内网使用、定期更换密码等
    • 安全配置限制提示
  • 使用 localStorage 记录用户已确认首次警告
  • 符合面板风格的弹窗设计

关键代码:

// 检测 HTTP 访问并显示安全警告(仅首次自动弹出)
useEffect(() => {
  const isHttp = window.location.protocol === 'http:'
  const dismissed = localStorage.getItem('httpWarningDismissed') === 'true'
  
  if (isHttp) {
    setShowHttpWarning(true)
    if (!dismissed) {
      // 首次访问,延迟显示弹窗
      const timer = setTimeout(() => {
        setHttpWarningDismissed(false)
      }, 500)
      return () => clearTimeout(timer)
    } else {
      // 已经确认过,不自动弹出
      setHttpWarningDismissed(true)
    }
  }
}, [])

// 常驻的"环境不安全"按钮
{showHttpWarning && (
  <button
    onClick={handleShowHttpWarning}
    className="fixed top-4 left-4 px-4 py-2 bg-orange-600/90 hover:bg-orange-700/90 
      text-white rounded-lg animate-pulse-slow"
  >
    <AlertTriangle className="w-4 h-4" />
    <span>环境不安全</span>
  </button>
)}

2. 设置页面安全配置限制

文件: client/src/pages/SettingsPage.tsx

功能:

  • 检测当前访问协议HTTP/HTTPS
  • HTTP 访问时在安全配置区域显示醒目的警告横幅
  • HTTP 访问时的限制
    • 令牌到期时间:最大 24 小时(可修改,但不能超过 24
    • 永不到期选项:禁用
    • 令牌重置规则:可自由选择(启动时重置/过期自动重置)
    • 重置令牌按钮:可用
  • HTTPS 访问时无限制
    • 令牌到期时间:最大 8760 小时1年
    • 所有选项均可自由配置
  • 尝试设置超过限制时显示友好的提示消息
  • 显示当前访问环境的限制信息

关键代码:

const handleSecurityConfigChange = (updates) => {
  const newConfig = { ...securityConfig, ...updates }

  // HTTP 访问时限制最大 24 小时
  if (isHttpAccess && updates.tokenExpireHours !== null && updates.tokenExpireHours !== undefined) {
    if (updates.tokenExpireHours > 24) {
      addNotification({
        type: 'warning',
        title: '设置受限',
        message: 'HTTP 访问时令牌到期时间最大为 24 小时'
      })
      newConfig.tokenExpireHours = 24
    }
  }

  // HTTP 访问时禁止设置永不到期
  if (isHttpAccess && updates.tokenExpireHours === null) {
    addNotification({
      type: 'warning',
      title: '操作受限',
      message: 'HTTP 访问时不允许设置永不到期,请使用 HTTPS 访问'
    })
    return
  }
  // ... 正常处理逻辑
}

3. 重置令牌功能优化

文件: server/src/routes/security.ts

功能:

  • 随时可用的令牌重置功能(不再依赖重置规则)
  • 点击重置按钮立即重新生成 JWT 密钥
  • 所有现有令牌立即失效
  • 用户需要重新登录
  • 记录操作日志

关键代码:

// 重置JWT密钥随时可用
router.post('/reset-token', authenticateToken, async (req: Request, res: Response) => {
  try {
    // 重新生成JWT密钥使所有现有令牌失效
    await configManager.regenerateJWTSecret()
    
    logger.info('JWT密钥已手动重新生成所有现有令牌已失效')
    
    res.json({
      success: true,
      message: 'JWT密钥已重新生成所有现有令牌将失效请重新登录'
    })
  } catch (error) {
    logger.error('重置令牌失败:', error)
    res.status(500).json({
      success: false,
      message: '重置令牌失败'
    })
  }
})

4. 开发者工具强制修改令牌到期时间

文件: client/src/modules/developer/components/DeveloperToolsPanel.tsx

功能:

  • 在开发者工具页面新增"强制修改令牌到期时间"功能
  • 显示当前安全配置(重置规则、到期时间)
  • 允许开发者绕过 HTTP 限制强制修改令牌到期时间
  • 包含醒目的警告提示,说明这是开发者专用功能
  • 输入验证1-8760 小时)
  • 实时更新配置并显示成功/失败消息

关键代码:

const handleForceUpdateTokenExpire = async () => {
  if (tokenExpireHours <= 0) {
    addNotification({
      type: 'error',
      title: '输入错误',
      message: '令牌到期时间必须大于0'
    })
    return
  }

  const result = await apiClient.updateSecurityConfig({
    tokenResetRule: currentConfig?.tokenResetRule || 'expire',
    tokenExpireHours: tokenExpireHours
  })
  // ... 处理结果
}

技术实现细节

协议检测

  • 使用 window.location.protocol 检测访问协议
  • 在组件挂载时执行检测
  • 使用 React state 管理检测结果

状态管理

  • 登录页使用 localStorage 存储警告确认状态(持久化)
  • 设置页使用 React state 管理 HTTP 访问状态
  • 开发者工具使用 API 获取实时配置
  • HTTP 访问时自动触发安全配置强制更新

UI/UX 设计

  • 所有弹窗都有淡入淡出动画animate-fade-in/animate-fade-out
  • "环境不安全"按钮带慢速脉冲动画animate-pulse-slow
  • 使用 Lucide React 图标库AlertTriangle, Shield, Clock 等)
  • 遵循面板现有的设计风格card-game, btn-game 等)
  • 颜色语义化:橙色表示警告,红色表示危险,蓝色表示信息
  • 常驻按钮设计:固定在左上角,不遮挡主要内容

安全考虑

  • HTTP 访问时自动强制切换为 24 小时令牌重置模式
  • HTTP 访问时禁用安全配置修改(除重置令牌外)
  • 重置令牌功能保持可用,方便紧急情况处理
  • 开发者工具需要额外认证才能访问
  • 所有 API 调用都需要认证令牌
  • 提供清晰的安全风险说明和强制配置信息

测试建议

1. HTTP 访问测试

# 使用 HTTP 访问面板
http://localhost:3000/login
  • 验证登录页首次访问时自动弹出安全警告
  • 验证登录页左上角显示"环境不安全"按钮(带脉冲动画)
  • 验证点击"环境不安全"按钮可重新查看警告详情
  • 验证设置页显示 HTTP 访问限制警告横幅
  • 验证令牌重置规则可以自由选择
  • 验证令牌到期时间可以修改1-24 小时)
  • 验证输入超过 24 小时会自动限制为 24 并提示
  • 验证永不到期选项被禁用,点击时显示提示
  • 验证重置令牌按钮可用,点击后所有令牌失效

2. HTTPS 访问测试

# 使用 HTTPS 访问面板
https://localhost:3000/login
  • 验证登录页不显示"环境不安全"按钮
  • 验证登录页不自动弹出安全警告
  • 验证设置页安全配置可正常修改
  • 验证可以自由设置令牌重置规则和到期时间
  • 验证令牌到期时间最大值为 8760 小时1年
  • 验证重置令牌按钮可用,点击后所有令牌失效

3. 令牌重置测试

  • 在设置页点击"重置令牌"按钮
  • 验证显示成功消息:"JWT密钥已重新生成所有现有令牌将失效请重新登录"
  • 验证当前会话立即失效
  • 验证需要重新登录才能继续使用
  • 验证其他已登录的会话也同时失效

4. 开发者工具测试

  • 访问开发者工具页面
  • 验证可以查看当前安全配置
  • 验证可以强制修改令牌到期时间
  • 验证修改后配置立即生效

5. 令牌到期测试

  • 设置令牌到期时间为 1 小时
  • 等待 1 小时后验证令牌自动失效
  • 验证需要重新登录

相关文件

前端文件

  • client/src/pages/LoginPage.tsx - 登录页HTTP 警告 + 常驻按钮)
  • client/src/pages/SettingsPage.tsx - 设置页(安全配置限制 + 强制 24 小时重置)
  • client/src/modules/developer/components/DeveloperToolsPanel.tsx - 开发者工具(强制修改)
  • client/src/utils/api.ts - API 客户端(安全配置 API
  • client/src/index.css - 样式文件(慢速脉冲动画)

后端文件

  • server/src/routes/security.ts - 安全配置路由
  • server/src/modules/config/ConfigManager.ts - 配置管理器
  • server/src/modules/auth/AuthManager.ts - 认证管理器

注意事项

  1. HTTP 警告仅在首次访问时自动弹出,用户确认后会记录在 localStorage 中,但"环境不安全"按钮会常驻显示
  2. "环境不安全"按钮常驻在登录页左上角,用户可随时点击查看安全警告详情
  3. HTTP 访问时自动强制切换为 24 小时令牌重置模式,无需手动设置
  4. HTTP 访问时令牌到期时间最大 24 小时HTTPS 访问时最大 8760 小时
  5. 设置页的限制是实时的,切换协议后立即生效
  6. 重置令牌功能随时可用,不依赖重置规则,点击后立即使所有令牌失效
  7. 重置令牌后需要重新登录,包括当前会话和其他已登录的会话
  8. 开发者工具需要额外认证,确保只有授权用户可以访问
  9. 令牌到期时间的修改会立即生效,影响所有新生成的令牌
  10. 慢速脉冲动画通过 CSS keyframes 实现3 秒一个周期

后续优化建议

  1. 添加 HTTPS 配置向导,帮助用户快速配置证书
  2. 在系统信息中显示当前访问协议和安全状态
  3. 添加令牌到期时间的历史记录
  4. 支持多种令牌到期策略(按用户、按设备等)
  5. 添加令牌使用情况的统计和监控
  6. 支持自定义 HTTP 访问时的强制令牌到期时间(目前固定为 24 小时)
  7. 添加访问协议切换的日志记录

新增 CSS 动画

文件: client/src/index.css

/* 慢速脉冲动画 */
@keyframes pulse-slow {
  0%, 100% {
    opacity: 1;
  }
  50% {
    opacity: 0.7;
  }
}

.animate-pulse-slow {
  animation: pulse-slow 3s ease-in-out infinite;
}

此动画用于"环境不安全"按钮,提供柔和的视觉提示效果。