Files
kefu_cloud/server/internal/handler/auth.go
T
yml2213 d4ba9e7a56 全局重命名:kefu_sys / kefu-sys 改为 kefu_cloud / kefu-cloud
- Go module 与全部 import 路径
- 数据库默认库名、Docker 服务/卷命名与部署文档
2026-07-15 15:23:10 +08:00

62 lines
1.6 KiB
Go

package handler
import (
"net/http"
"github.com/gin-gonic/gin"
"golang.org/x/crypto/bcrypt"
"kefu-cloud/server/internal/middleware"
"kefu-cloud/server/internal/model"
)
type AuthHandler struct{}
func NewAuthHandler() *AuthHandler { return &AuthHandler{} }
type LoginReq struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
}
func (h *AuthHandler) Login(c *gin.Context) {
var req LoginReq
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"code": 400, "message": "参数错误"})
return
}
var user model.User
if err := model.DB.Where("username = ?", req.Username).First(&user).Error; err != nil {
c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "message": "用户名或密码错误"})
return
}
if err := bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(req.Password)); err != nil {
c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "message": "用户名或密码错误"})
return
}
if status, message := middleware.ValidateUserAccess(user.ID, user.TenantID, user.Role); status != 0 {
c.JSON(status, gin.H{"code": status, "message": message})
return
}
token, err := middleware.GenerateToken(user.ID, user.TenantID, user.Role)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"code": 500, "message": "生成token失败"})
return
}
c.JSON(http.StatusOK, gin.H{
"code": 0,
"message": "登录成功",
"data": gin.H{
"token": token,
"user_id": user.ID,
"tenant_id": user.TenantID,
"nickname": user.Nickname,
"role": user.Role,
},
})
}