mirror of
https://github.com/GSManagerXZ/GameServerManager.git
synced 2026-05-09 23:20:59 +08:00
10 KiB
10 KiB
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- 认证管理器
注意事项
- HTTP 警告仅在首次访问时自动弹出,用户确认后会记录在 localStorage 中,但"环境不安全"按钮会常驻显示
- "环境不安全"按钮常驻在登录页左上角,用户可随时点击查看安全警告详情
- HTTP 访问时自动强制切换为 24 小时令牌重置模式,无需手动设置
- HTTP 访问时令牌到期时间最大 24 小时,HTTPS 访问时最大 8760 小时
- 设置页的限制是实时的,切换协议后立即生效
- 重置令牌功能随时可用,不依赖重置规则,点击后立即使所有令牌失效
- 重置令牌后需要重新登录,包括当前会话和其他已登录的会话
- 开发者工具需要额外认证,确保只有授权用户可以访问
- 令牌到期时间的修改会立即生效,影响所有新生成的令牌
- 慢速脉冲动画通过 CSS keyframes 实现,3 秒一个周期
后续优化建议
- 添加 HTTPS 配置向导,帮助用户快速配置证书
- 在系统信息中显示当前访问协议和安全状态
- 添加令牌到期时间的历史记录
- 支持多种令牌到期策略(按用户、按设备等)
- 添加令牌使用情况的统计和监控
- 支持自定义 HTTP 访问时的强制令牌到期时间(目前固定为 24 小时)
- 添加访问协议切换的日志记录
新增 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;
}
此动画用于"环境不安全"按钮,提供柔和的视觉提示效果。