auth_controller.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package controller
  2. import (
  3. "net/http"
  4. "time"
  5. "github.com/2930134478/AI-CS/backend/service"
  6. "github.com/2930134478/AI-CS/backend/utils"
  7. "github.com/gin-gonic/gin"
  8. )
  9. // AuthController 负责处理认证相关的 HTTP 请求。
  10. type AuthController struct {
  11. authService *service.AuthService
  12. }
  13. // NewAuthController 创建 AuthController 实例。
  14. func NewAuthController(authService *service.AuthService) *AuthController {
  15. return &AuthController{authService: authService}
  16. }
  17. type loginRequest struct {
  18. Username string `json:"username"`
  19. Password string `json:"password"`
  20. }
  21. // Login 处理登录请求。
  22. func (a *AuthController) Login(c *gin.Context) {
  23. var req loginRequest
  24. if err := c.ShouldBindJSON(&req); err != nil || req.Username == "" || req.Password == "" {
  25. c.JSON(http.StatusBadRequest, gin.H{"error": "用户名和密码不能为空"})
  26. return
  27. }
  28. user, err := a.authService.Login(req.Username, req.Password)
  29. if err != nil {
  30. switch err {
  31. case service.ErrInvalidCredentials:
  32. c.JSON(http.StatusUnauthorized, gin.H{"error": "用户名或密码错误"})
  33. default:
  34. c.JSON(http.StatusInternalServerError, gin.H{"error": "登录失败"})
  35. }
  36. return
  37. }
  38. wsToken, wsTokenExp, tokenErr := utils.GenerateWSToken(user.ID, 24*time.Hour)
  39. if tokenErr != nil {
  40. c.JSON(http.StatusInternalServerError, gin.H{"error": "登录失败"})
  41. return
  42. }
  43. c.JSON(http.StatusOK, gin.H{
  44. "message": "登录成功",
  45. "user_id": user.ID,
  46. "username": user.Username,
  47. "role": user.Role,
  48. "ws_token": wsToken,
  49. "ws_token_exp": wsTokenExp,
  50. // permissions 用于前端侧边栏显示(后端强校验以 X-User-Id 为准)
  51. "permissions": func() []string {
  52. if user.Role == "admin" {
  53. return service.AllPermissionKeys()
  54. }
  55. keys := service.DecodePermissions(user.Permissions)
  56. if len(keys) == 0 {
  57. return service.DefaultAgentPermissions()
  58. }
  59. return keys
  60. }(),
  61. })
  62. }
  63. // Logout 响应退出登录请求。
  64. func (a *AuthController) Logout(c *gin.Context) {
  65. c.JSON(http.StatusOK, gin.H{"message": "退出成功"})
  66. }