crm/internal/handlers/auth_handler.go
2026-01-26 11:15:12 +08:00

82 lines
2.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package handlers
import (
"encoding/json"
"net/http"
"time"
"github.com/golang-jwt/jwt/v5"
)
// JWTSecret 应该在实际环境中使用环境变量
var JWTSecret = []byte("crm-go-secret-key")
// LoginRequest 登录请求结构
type LoginRequest struct {
Username string `json:"username"`
Password string `json:"password"`
}
// LoginResponse 登录返回结构
type LoginResponse struct {
Token string `json:"token"`
}
// AuthHandler 身份验证处理器
type AuthHandler struct{}
// NewAuthHandler 创建身份验证处理器
func NewAuthHandler() *AuthHandler {
return &AuthHandler{}
}
// Login 处理登录请求
func (h *AuthHandler) Login(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "方法不允许", http.StatusMethodNotAllowed)
return
}
var req LoginRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "请求参数错误", http.StatusBadRequest)
return
}
// 定义用户账户和角色
// admin: 只读用户,不能删除数据
// administrator: 管理员,拥有完全控制权限
type UserInfo struct {
Password string
Role string
}
users := map[string]UserInfo{
"admin": {Password: "digua666", Role: "viewer"}, // 只读用户
"administrator": {Password: "digua888", Role: "admin"}, // 管理员
}
// 验证用户名和密码
user, exists := users[req.Username]
if !exists || user.Password != req.Password {
http.Error(w, "用户名或密码错误", http.StatusUnauthorized)
return
}
// 生成 JWT Token包含角色信息
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"username": req.Username,
"role": user.Role,
"exp": time.Now().Add(time.Hour * 24).Unix(), // 24小时过期
})
tokenString, err := token.SignedString(JWTSecret)
if err != nil {
http.Error(w, "无法生成Token", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(LoginResponse{Token: tokenString})
}