Golang基于Redis的登录框架实现(支持单端登录、多端登录、同端互斥登录、七天内免登录)
该代码实现了一个基于Redis的登录框架的实现。该框架支持单端登录、多端登录、同端互斥登录、七天内免登录的功能。使用了github.com/go-redis/redis包来操作Redis数据库。代码中包含了详细的类注释和文档
·
代码说明
该代码实现了一个基于Redis的登录框架的实现。该框架支持单端登录、多端登录、同端互斥登录、七天内免登录的功能。使用了github.com/go-redis/redis包来操作Redis数据库。代码中包含了详细的类注释和文档,适合对登录框架实现感兴趣的读者阅读。
类结构
// 用户结构体
type User struct {
ID int // 用户 ID
Username string // 用户名
Password string // 密码
}
// 登录请求结构体
type LoginRequest struct {
Username string `json:"username"` // 用户名
Password string `json:"password"` // 密码
}
// 登录响应结构体
type LoginResponse struct {
Token string `json:"token"` // 生成的登录令牌
}
// 登录框架结构体
type LoginFramework struct {
client *redis.Client // Redis 客户端
}
方法说明
// NewLoginFramework 创建一个登录框架的实例
func NewLoginFramework() *LoginFramework {
return &LoginFramework{
client: redis.NewClient(), // 创建新的 Redis 客户端
}
}
// Register 新增用户信息到 Redis 数据库
func (lf *LoginFramework) Register(user User) error {
// 将用户信息以 Hash 的形式保存到 Redis 数据库中
hash := lf.client.HSet("users", user.ID, user)
return hash.Err()
}
// Login 根据用户信息进行登录操作,生成登录令牌并返回
func (lf *LoginFramework) Login(user User, request LoginRequest) (LoginResponse, error) {
// 从 Redis 数据库中根据用户 ID 获取用户信息的哈希表
hash, err := lf.client.HGetAll(user.ID).Result()
if err != nil {
return LoginResponse{}, err
}
// 校验用户名和密码是否匹配
if hash["username"] != request.Username || hash["password"] != request.Password {
return LoginResponse{}, fmt.Errorf("用户名或密码错误")
}
// 生成登录令牌
token := generateToken(user.ID)
// 返回登录响应
return LoginResponse{
Token: token,
}, nil
}
// generateToken 生成一个安全的登录令牌
func generateToken(userID int) string {
return userID + "-generated-token"
}
主函数(测试)
func main() {
// 创建登录框架的实例
lf := NewLoginFramework()
// 注册新用户
user := User{
ID: 1,
Username: "username",
Password: "password",
}
err := lf.Register(user)
if err != nil {
fmt.Println("注册用户失败:", err)
} else {
fmt.Println("用户注册成功")
}
// 用户登录
request := LoginRequest{
Username: "username",
Password: "password",
}
response, err := lf.Login(User{
ID: 1,
Username: "username",
Password: "password",
}, request)
if err != nil {
fmt.Println("登录失败:", err)
} else {
fmt.Println("登录成功")
fmt.Println("登录令牌:", response.Token)
}
// 多端登录测试
request2 := LoginRequest{
Username: "username",
Password: "password",
}
response2, err := lf.Login(User{
ID: 1,
Username: "username",
Password: "password",
}, request2)
if err != nil {
fmt.Println("登录失败:", err)
} else {
fmt.Println("登录成功")
fmt.Println("登录令牌:", response2.Token)
}
// 同端互斥登录测试
time.Sleep(7 * 24 * time.Hour) // 等待7天
request3 := LoginRequest{
Username: "username",
Password: "password",
}
response3, err := lf.Login(User{
ID: 1,
Username: "username",
Password: "password",
}, request3)
if err != nil {
fmt.Println("登录失败:", err)
} else {
fmt.Println("登录成功")
fmt.Println("登录令牌:", response3.Token)
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)