✅ 新增功能: 1. 用户认证数据库模型 - AuthToken (认证令牌) - LoginAttempt (登录尝试记录) - PasswordReset (密码重置) - Session (用户会话) 2. 认证服务 (AuthService) - 用户登录/注册 - 令牌刷新 - 密码重置 - 会话管理 3. JWT管理器 - 访问令牌生成/验证 - 刷新令牌管理 - 密码重置令牌 - API令牌支持 🔒 安全特性: - bcrypt密码加密 - JWT令牌验证 - 登录尝试记录 - 会话管理 - 令牌撤销机制 📝 技术实现: - 使用GORM进行数据库操作 - JWT v5进行令牌管理 - 完整的错误处理 - 详细的日志记录 作者:小弟 (大哥的AI助手) 分支:feature/user-authentication
114 lines
4.0 KiB
Go
114 lines
4.0 KiB
Go
package models
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// AuthToken 认证令牌模型
|
|
type AuthToken struct {
|
|
ID uint `gorm:"primaryKey" json:"id"`
|
|
TenantID uint `gorm:"not null;index" json:"tenant_id"`
|
|
UserID uint `gorm:"not null;index" json:"user_id"`
|
|
|
|
// 令牌信息
|
|
Token string `gorm:"size:512;not null;uniqueIndex" json:"token"`
|
|
TokenType string `gorm:"size:20;not null" json:"token_type"` // access, refresh
|
|
ExpiresAt time.Time `gorm:"not null" json:"expires_at"`
|
|
|
|
// 设备信息
|
|
DeviceID string `gorm:"size:100" json:"device_id"`
|
|
DeviceName string `gorm:"size:100" json:"device_name"`
|
|
DeviceType string `gorm:"size:50" json:"device_type"` // web, mobile, desktop
|
|
IPAddress string `gorm:"size:45" json:"ip_address"`
|
|
UserAgent string `gorm:"type:text" json:"user_agent"`
|
|
|
|
// 状态
|
|
IsRevoked bool `gorm:"default:false" json:"is_revoked"`
|
|
RevokedAt *time.Time `json:"revoked_at"`
|
|
RevokedReason string `gorm:"size:200" json:"revoked_reason"`
|
|
|
|
// 时间戳
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
|
|
// 关联
|
|
Tenant Tenant `gorm:"foreignKey:TenantID" json:"tenant,omitempty"`
|
|
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
|
}
|
|
|
|
// LoginAttempt 登录尝试记录
|
|
type LoginAttempt struct {
|
|
ID uint `gorm:"primaryKey" json:"id"`
|
|
TenantID uint `gorm:"not null;index" json:"tenant_id"`
|
|
UserID *uint `gorm:"index" json:"user_id"`
|
|
|
|
// 尝试信息
|
|
Username string `gorm:"size:100" json:"username"`
|
|
Email string `gorm:"size:100" json:"email"`
|
|
IPAddress string `gorm:"size:45;not null" json:"ip_address"`
|
|
UserAgent string `gorm:"type:text" json:"user_agent"`
|
|
|
|
// 结果
|
|
Success bool `gorm:"not null" json:"success"`
|
|
FailureReason string `gorm:"size:200" json:"failure_reason"`
|
|
|
|
// 时间戳
|
|
CreatedAt time.Time `json:"created_at"`
|
|
|
|
// 关联
|
|
Tenant Tenant `gorm:"foreignKey:TenantID" json:"tenant,omitempty"`
|
|
User *User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
|
}
|
|
|
|
// PasswordReset 密码重置请求
|
|
type PasswordReset struct {
|
|
ID uint `gorm:"primaryKey" json:"id"`
|
|
TenantID uint `gorm:"not null;index" json:"tenant_id"`
|
|
UserID uint `gorm:"not null;index" json:"user_id"`
|
|
|
|
// 重置信息
|
|
Token string `gorm:"size:100;not null;uniqueIndex" json:"token"`
|
|
ExpiresAt time.Time `gorm:"not null" json:"expires_at"`
|
|
|
|
// 状态
|
|
IsUsed bool `gorm:"default:false" json:"is_used"`
|
|
UsedAt *time.Time `json:"used_at"`
|
|
IPAddress string `gorm:"size:45" json:"ip_address"`
|
|
|
|
// 时间戳
|
|
CreatedAt time.Time `json:"created_at"`
|
|
|
|
// 关联
|
|
Tenant Tenant `gorm:"foreignKey:TenantID" json:"tenant,omitempty"`
|
|
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
|
}
|
|
|
|
// Session 用户会话
|
|
type Session struct {
|
|
ID uint `gorm:"primaryKey" json:"id"`
|
|
TenantID uint `gorm:"not null;index" json:"tenant_id"`
|
|
UserID uint `gorm:"not null;index" json:"user_id"`
|
|
|
|
// 会话信息
|
|
SessionID string `gorm:"size:100;not null;uniqueIndex" json:"session_id"`
|
|
ExpiresAt time.Time `gorm:"not null" json:"expires_at"`
|
|
|
|
// 设备信息
|
|
DeviceID string `gorm:"size:100" json:"device_id"`
|
|
DeviceName string `gorm:"size:100" json:"device_name"`
|
|
DeviceType string `gorm:"size:50" json:"device_type"`
|
|
IPAddress string `gorm:"size:45" json:"ip_address"`
|
|
UserAgent string `gorm:"type:text" json:"user_agent"`
|
|
|
|
// 活动信息
|
|
LastActivity time.Time `json:"last_activity"`
|
|
IsActive bool `gorm:"default:true" json:"is_active"`
|
|
|
|
// 时间戳
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
|
|
// 关联
|
|
Tenant Tenant `gorm:"foreignKey:TenantID" json:"tenant,omitempty"`
|
|
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
|
|
} |