minio接入 & 聊天功能完善
This commit is contained in:
@@ -3,8 +3,12 @@ package mysql
|
||||
import (
|
||||
"acquaintances/biz/model"
|
||||
"acquaintances/biz/model/user"
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
"fmt"
|
||||
"golang.org/x/crypto/scrypt"
|
||||
"gorm.io/gorm"
|
||||
"time"
|
||||
|
||||
"github.com/cloudwego/hertz/pkg/common/hlog"
|
||||
)
|
||||
@@ -123,3 +127,64 @@ func FindUser(keyword *string) (*user.UserInfoReq, error) {
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
// CheckLogin 验证登录(适配 Scrypt 加密)
|
||||
func CheckLogin(username, password string) (*model.User, error) {
|
||||
var user model.User
|
||||
|
||||
// 1. 查询用户(支持 user_id/手机号/用户名登录)
|
||||
result := DB.Model(&model.User{}).Where(
|
||||
"user_id = ? OR mobile = ? OR user_name = ?",
|
||||
username, username, username,
|
||||
).First(&user)
|
||||
|
||||
// 2. 处理查询错误
|
||||
if result.Error != nil {
|
||||
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
|
||||
return nil, fmt.Errorf("用户名或密码错误") // 模糊错误,防枚举
|
||||
}
|
||||
return nil, fmt.Errorf("登录失败:%w", result.Error)
|
||||
}
|
||||
|
||||
// 3. 检查用户状态
|
||||
//TODO
|
||||
|
||||
// 4. 验证密码(核心:使用 Scrypt 算法校验)
|
||||
// 4.1 解码存储的盐值(加密时用 base64.URLEncoding)
|
||||
salt, err := base64.URLEncoding.DecodeString(user.UserSalt)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("密码验证失败")
|
||||
}
|
||||
|
||||
// 4.2 用相同算法计算输入密码的哈希
|
||||
const keyLen = 10
|
||||
inputHash, err := scrypt.Key([]byte(password), salt, 16384, 8, 1, keyLen)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("密码验证失败")
|
||||
}
|
||||
|
||||
// 4.3 对比计算结果与存储的密码哈希
|
||||
storedHash := user.UserPassword
|
||||
inputHashBase64 := base64.StdEncoding.EncodeToString(inputHash)
|
||||
if inputHashBase64 != storedHash {
|
||||
return nil, fmt.Errorf("用户名或密码错误")
|
||||
}
|
||||
|
||||
// 5. 更新最后登录信息
|
||||
return &user, updateLastLoginInfo(user.ID, getClientIP())
|
||||
}
|
||||
|
||||
// 辅助函数:更新登录信息
|
||||
func updateLastLoginInfo(userID uint, loginIP string) error {
|
||||
now := time.Now()
|
||||
return DB.Model(&model.User{}).Where("id = ?", userID).Updates(map[string]interface{}{
|
||||
"last_login_ip": loginIP,
|
||||
"last_login_time": &now,
|
||||
}).Error
|
||||
}
|
||||
|
||||
// 辅助函数:获取客户端IP
|
||||
func getClientIP() string {
|
||||
//TODO
|
||||
return "127.0.0.1"
|
||||
}
|
||||
|
Reference in New Issue
Block a user