🎨 优化登录逻辑,新增后端ip判断

This commit is contained in:
2025-10-22 00:11:43 +08:00
parent 56333b363b
commit 6e924c9630
2 changed files with 87 additions and 18 deletions

View File

@@ -137,6 +137,40 @@ func (*AppUserApi) WechatLogin(ctx *gin.Context) {
r.Banned("用户已被禁用", ctx)
return
}
// 添加登录日志
loginLog := user2.LoginLog{
UserId: user.ID,
UserName: user.NickName,
Phone: user.Phone,
Ip: ctx.ClientIP(),
Address: utils.GetIPAdcode(ctx.ClientIP()),
Device: ctx.Request.Header.Get("sec-ch-ua-platform"),
UserAgent: ctx.Request.UserAgent(),
Mode: "微信登录",
LoginTime: time.Now().Format("2006-01-02 15:04:05"),
}
go func() {
err = global.GVA_DB.Create(&loginLog).Error
if err != nil {
global.GVA_LOG.Error("添加登录日志失败!", zap.Error(err))
}
}()
adcodes := utils.CheckIPInAdcodes(loginLog.Address)
if !adcodes {
global.GVA_LOG.Warn("异常登录地址", zap.String("address", loginLog.Address), zap.Uint("userId", user.ID))
user.Status = 0
if err := global.GVA_DB.Save(&user).Error; err != nil {
global.GVA_LOG.Error("禁用用户失败!", zap.Error(err))
}
r.Banned("用户已被禁用", ctx)
return
}
// 生成token
token, claims, err := user_jwt.LoginToken(user)
if err != nil {
@@ -157,24 +191,6 @@ func (*AppUserApi) WechatLogin(ctx *gin.Context) {
}
user_jwt.SetToken(ctx, token, int(claims.RegisteredClaims.ExpiresAt.Unix()-time.Now().Unix()))
// 添加登录日志
loginLog := user2.LoginLog{
UserId: user.ID,
UserName: user.NickName,
Phone: user.Phone,
Ip: ctx.ClientIP(),
Address: utils.GetIPAdcode(ctx.ClientIP()),
Device: ctx.Request.Header.Get("sec-ch-ua-platform"),
UserAgent: ctx.Request.UserAgent(),
Mode: "微信登录",
LoginTime: time.Now().Format("2006-01-02 15:04:05"),
}
err = global.GVA_DB.Create(&loginLog).Error
if err != nil {
global.GVA_LOG.Error("添加登录日志失败!", zap.Error(err))
}
r.OkWithDetailed(gin.H{
"User": user,
"Token": token,
@@ -219,6 +235,39 @@ func (*AppUserApi) PwdLogin(ctx *gin.Context) {
return
}
// 添加登录日志
loginLog := user2.LoginLog{
UserId: user.ID,
UserName: user.NickName,
Phone: user.Phone,
Ip: ctx.ClientIP(),
Address: utils.GetIPAdcode(ctx.ClientIP()),
Device: ctx.Request.Header.Get("sec-ch-ua-platform"),
UserAgent: ctx.Request.UserAgent(),
Mode: "账号密码登录",
LoginTime: time.Now().Format("2006-01-02 15:04:05"),
}
go func() {
err = global.GVA_DB.Create(&loginLog).Error
if err != nil {
global.GVA_LOG.Error("添加登录日志失败!", zap.Error(err))
}
}()
adcodes := utils.CheckIPInAdcodes(loginLog.Address)
if !adcodes {
global.GVA_LOG.Warn("异常登录地址", zap.String("address", loginLog.Address), zap.Uint("userId", user.ID))
user.Status = 0
if err := global.GVA_DB.Save(&user).Error; err != nil {
global.GVA_LOG.Error("禁用用户失败!", zap.Error(err))
}
r.Banned("用户已被禁用", ctx)
return
}
// 生成token
token, claims, err := user_jwt.LoginToken(user)
if err != nil {

View File

@@ -4,6 +4,7 @@ import (
"encoding/json"
"fmt"
"net/http"
"strings"
"time"
)
@@ -13,6 +14,13 @@ type ipAdcodeResp struct {
} `json:"adcode"`
}
// adcodes 是允许的地区编码列表
var adcodes = []string{
"重庆",
"海南",
"广东",
}
func GetIPAdcode(ip string) string {
url := fmt.Sprintf("https://api.vore.top/api/IPdata?ip=%s", ip)
client := &http.Client{Timeout: 5 * time.Second}
@@ -27,3 +35,15 @@ func GetIPAdcode(ip string) string {
}
return result.Adcode.O
}
// CheckIPInAdcodes 检测用户IP是否在指定的地区编码范围内
func CheckIPInAdcodes(ipAdcode string) bool {
lower := strings.ToLower(ipAdcode)
for _, code := range adcodes {
// 检测是否包含
if strings.Contains(lower, strings.ToLower(code)) {
return true
}
}
return false
}