mirror of
https://github.com/2930134478/AI-CS.git
synced 2026-06-15 08:45:41 +08:00
77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
package controller
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/2930134478/AI-CS/backend/service"
|
|
"github.com/2930134478/AI-CS/backend/utils"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// AuthController 负责处理认证相关的 HTTP 请求。
|
|
type AuthController struct {
|
|
authService *service.AuthService
|
|
}
|
|
|
|
// NewAuthController 创建 AuthController 实例。
|
|
func NewAuthController(authService *service.AuthService) *AuthController {
|
|
return &AuthController{authService: authService}
|
|
}
|
|
|
|
type loginRequest struct {
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
}
|
|
|
|
// Login 处理登录请求。
|
|
func (a *AuthController) Login(c *gin.Context) {
|
|
var req loginRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil || req.Username == "" || req.Password == "" {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "用户名和密码不能为空"})
|
|
return
|
|
}
|
|
|
|
user, err := a.authService.Login(req.Username, req.Password)
|
|
if err != nil {
|
|
switch err {
|
|
case service.ErrInvalidCredentials:
|
|
c.JSON(http.StatusUnauthorized, gin.H{"error": "用户名或密码错误"})
|
|
default:
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "登录失败"})
|
|
}
|
|
return
|
|
}
|
|
|
|
wsToken, wsTokenExp, tokenErr := utils.GenerateWSToken(user.ID, 24*time.Hour)
|
|
if tokenErr != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "登录失败"})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"message": "登录成功",
|
|
"user_id": user.ID,
|
|
"username": user.Username,
|
|
"role": user.Role,
|
|
"ws_token": wsToken,
|
|
"ws_token_exp": wsTokenExp,
|
|
// permissions 用于前端侧边栏显示(后端强校验以 X-User-Id 为准)
|
|
"permissions": func() []string {
|
|
if user.Role == "admin" {
|
|
return service.AllPermissionKeys()
|
|
}
|
|
keys := service.DecodePermissions(user.Permissions)
|
|
if len(keys) == 0 {
|
|
return service.DefaultAgentPermissions()
|
|
}
|
|
return keys
|
|
}(),
|
|
})
|
|
}
|
|
|
|
// Logout 响应退出登录请求。
|
|
func (a *AuthController) Logout(c *gin.Context) {
|
|
c.JSON(http.StatusOK, gin.H{"message": "退出成功"})
|
|
}
|