Files
kami_backend/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/用户认证管理/会话管理.md
danial 96ed936079 docs(api): 添加详细Apple卡密管理API文档
- 新增API端点参考文档,涵盖权限、卡密、订单、商户、监控、限制等模块
- 详细说明Apple卡密充值处理流程,包括提交、查询、回调和轮询接口
- 描述充值订单状态机及生命周期,支持超时重试和状态迁移
- 介绍签名验证、幂等控制及重复卡密防刷单策略
- 增加商户配置管理、历史记录查询和错误处理机制说明
- 提供API使用示例代码及客户端实现指导
- 删除过时的.drone.yml.bak文件,清理无用配置
- 添加.dockerignore忽略指定目录和文件
2025-10-08 20:13:40 +08:00

11 KiB
Raw Blame History

会话管理

**Referenced Files in This Document** - [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go) - [sysUser_v1_user_login_out.go](file://internal/controller/sysUser/sysUser_v1_user_login_out.go) - [auth.go](file://internal/middleware/auth.go) - [user_token.go](file://utility/token/user_token.go) - [models.go](file://utility/config/models.go) - [sys_user.go](file://internal/service/sys_user.go) - [sys_user.go](file://internal/logic/sys_user/sys_user.go) - [sys_user.go](file://internal/model/sys_user.go) - [sys_user_login.go](file://internal/model/sys_user_login.go)

目录

  1. 简介
  2. 认证流程
  3. 令牌管理
  4. 认证中间件
  5. 用户登出机制
  6. 安全策略
  7. 性能优化
  8. 总结

简介

本文档详细阐述了kami_backend系统的会话管理机制包括用户身份验证、令牌生成与验证、会话控制和安全防护等核心功能。系统采用JWTJSON Web Token作为主要的认证机制结合Redis缓存实现高效的会话管理。会话管理模块主要由认证控制器、令牌服务、认证中间件和用户服务等组件构成共同保障系统的安全性和可用性。

Section sources

认证流程

系统的用户认证流程遵循标准的JWT认证模式通过用户名和密码进行身份验证并生成相应的访问令牌。认证过程包括验证码验证、用户信息查询、密码比对和令牌生成等步骤。

sequenceDiagram
participant Client as "客户端"
participant Controller as "认证控制器"
participant Service as "用户服务"
participant Token as "令牌服务"
Client->>Controller : 提交登录请求(用户名、密码、验证码)
Controller->>Service : 验证验证码
Service-->>Controller : 验证结果
alt 验证失败
Controller-->>Client : 返回验证码错误
else 验证成功
Controller->>Service : 查询用户信息
Service-->>Controller : 返回用户数据
Controller->>Service : 验证密码
Service-->>Controller : 密码验证结果
alt 密码验证失败
Controller-->>Client : 返回用户名或密码错误
else 密码验证成功
Controller->>Token : 生成用户令牌
Token-->>Controller : 返回JWT令牌
Controller-->>Client : 返回登录成功响应(包含令牌)
end
end

Diagram sources

Section sources

令牌管理

令牌生成

系统使用JWT标准生成用户令牌令牌包含用户ID、用户名、签发时间、过期时间等信息。令牌生成过程由GenerateUserToken函数实现该函数根据配置的加密密钥对令牌进行签名并将令牌存储在Redis缓存中以支持令牌失效管理。

flowchart TD
Start([开始]) --> GenerateClaims["生成令牌声明(Claims)"]
GenerateClaims --> SetClaims["设置用户ID、用户名、签发者、过期时间等"]
SetClaims --> SignToken["使用HS256算法签名令牌"]
SignToken --> StoreRedis["将令牌存储到Redis缓存"]
StoreRedis --> ReturnToken["返回JWT令牌"]
ReturnToken --> End([结束])

Diagram sources

令牌验证

令牌验证是会话管理的核心环节,系统通过ParseUserToken函数解析和验证JWT令牌的有效性。验证过程包括检查令牌签名、过期时间以及从Redis中验证令牌是否存在。

flowchart TD
Start([开始]) --> ExtractToken["从请求头提取令牌"]
ExtractToken --> ParseToken["解析JWT令牌"]
ParseToken --> ValidateSignature["验证令牌签名"]
ValidateSignature --> CheckExpired["检查令牌是否过期"]
CheckExpired --> QueryRedis["查询Redis缓存中的令牌"]
QueryRedis --> CompareToken["比较请求令牌与缓存令牌"]
CompareToken --> IsValid{"令牌有效?"}
IsValid --> |是| ReturnSuccess["返回验证成功"]
IsValid --> |否| ReturnFailure["返回验证失败"]
ReturnSuccess --> End([结束])
ReturnFailure --> End

Diagram sources

令牌刷新

系统实现了智能的令牌刷新机制,当令牌的使用时间超过最大刷新时间但未过期时,系统会自动为用户生成新的令牌。这一机制既保证了用户体验的连续性,又增强了系统的安全性。

classDiagram
class UserToken {
+string UserID
+string Username
+RegisteredClaims RegisteredClaims
+genToken(ctx context.Context) string, error
}
class TokenService {
+GenerateUserToken(ctx context.Context, userName, userID string) string, error
+ParseUserToken(ctx context.Context, transToken string) *UserToken, error
+RefreshUserToken(ctx context.Context, userToken UserToken) string, error
+DeleteTokenFromRedis(ctx context.Context, userID string) error
}
class TokenConfig {
+string ServerName
+string CacheKey
+int64 Timeout
+int64 MaxRefresh
+[]byte EncryptKey
+string CacheModel
}
TokenService --> UserToken : "使用"
TokenService --> TokenConfig : "读取配置"

Diagram sources

Section sources

认证中间件

认证中间件是系统安全的第一道防线,负责拦截所有需要认证的请求,验证令牌的有效性,并在必要时进行令牌刷新。中间件还支持白名单机制,允许特定的公共接口无需认证即可访问。

flowchart TD
Start([请求进入]) --> CheckWhiteList["检查是否在白名单"]
CheckWhiteList --> IsWhiteList{"在白名单?"}
IsWhiteList --> |是| PassThrough["直接通过"]
IsWhiteList --> |否| GetToken["从请求获取令牌"]
GetToken --> ValidateToken["验证令牌有效性"]
ValidateToken --> IsValid{"令牌有效?"}
IsValid --> |是| RefreshToken["检查是否需要刷新"]
IsValid --> |否| ReturnError["返回未授权"]
RefreshToken --> NeedRefresh{"需要刷新?"}
NeedRefresh --> |是| GenerateNewToken["生成新令牌"]
NeedRefresh --> |否| Continue["继续处理"]
GenerateNewToken --> SetHeader["设置refresh-token响应头"]
SetHeader --> Continue
Continue --> NextMiddleware["调用下一个中间件"]
ReturnError --> SendResponse["发送错误响应"]
PassThrough --> NextMiddleware
NextMiddleware --> End([处理完成])
SendResponse --> End

Diagram sources

Section sources

用户登出机制

登出流程

用户登出功能通过UserLoginOut控制器实现当用户发起登出请求时系统会解析请求中的令牌提取用户ID并从Redis缓存中删除对应的令牌从而实现令牌的立即失效。

sequenceDiagram
participant Client as "客户端"
participant Controller as "登出控制器"
participant Token as "令牌服务"
Client->>Controller : 发送登出请求(包含令牌)
Controller->>Token : 解析用户令牌
Token-->>Controller : 返回用户信息
Controller->>Token : 删除Redis中的令牌
Token-->>Controller : 删除结果
Controller-->>Client : 返回登出成功响应

Diagram sources

会话清理

登出时的会话清理主要通过删除Redis缓存中的令牌来实现。系统使用DeleteTokenFromRedis函数根据用户ID删除对应的令牌记录确保用户无法再使用旧的令牌进行认证。

Section sources

安全策略

令牌安全存储

系统采用多层安全措施保护令牌的安全:

  1. 使用HTTPS协议传输令牌防止中间人攻击
  2. 令牌存储在Redis缓存中设置合理的过期时间
  3. 使用强加密算法(HS256)对令牌进行签名
  4. 敏感信息不存储在令牌中,仅包含必要的用户标识

过期时间设置

令牌的过期时间通过配置文件进行管理,系统支持灵活的过期策略:

  • 基础过期时间默认10天(可配置)
  • 最大刷新时间默认5天(可配置),超过此时间后令牌不再自动刷新
  • 令牌刷新机制:在最大刷新时间和过期时间之间使用时自动刷新

防止令牌劫持

系统通过以下机制防止令牌劫持:

  1. 令牌绑定用户会话,每次请求都验证令牌与用户的一致性
  2. 支持令牌立即失效,用户登出后旧令牌无法使用
  3. 白名单机制限制敏感操作的访问路径
  4. 请求头验证,确保令牌来源的合法性

Section sources

性能优化

缓存策略

系统采用Redis作为令牌的缓存存储相比内存存储具有以下优势

  • 支持分布式部署,多实例间共享会话状态
  • 数据持久化,重启后会话状态不丢失
  • 内置过期机制,自动清理过期令牌
  • 高性能读写,满足高并发场景需求

并发处理

认证中间件设计考虑了高并发场景下的性能表现:

  • 无状态设计,不依赖服务器本地存储
  • 轻量级验证仅需一次Redis查询即可完成认证
  • 支持异步刷新,不影响主请求处理流程
  • 白名单机制减少不必要的认证开销

资源管理

系统通过以下方式优化资源使用:

  • 合理设置令牌过期时间,平衡安全性和用户体验
  • 批量操作优化,减少数据库查询次数
  • 连接池管理,有效利用数据库连接资源
  • 日志分级,避免过度日志影响性能

Section sources

总结

kami_backend的会话管理系统采用现代化的JWT认证机制结合Redis缓存实现了高效、安全的用户会话管理。系统具有以下特点

  1. 安全性高采用标准JWT协议支持令牌刷新和立即失效
  2. 性能优越基于Redis的缓存设计支持高并发访问
  3. 灵活性好:配置化的过期策略和白名单机制
  4. 易于维护:清晰的代码结构和模块化设计

该会话管理机制能够有效支持系统的安全需求,为用户提供流畅的认证体验,同时具备良好的扩展性和维护性。