user_controller使用通用token逻辑

This commit is contained in:
2025-09-12 13:11:04 +08:00
parent 9f72c30e8b
commit e07017b3fc
5 changed files with 16 additions and 33 deletions

View File

@@ -2,31 +2,29 @@ package user
import (
"net/http"
"time"
"git.huangwc.com/pig/pig-farm-controller/internal/app/controller"
"git.huangwc.com/pig/pig-farm-controller/internal/app/service/token"
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
"git.huangwc.com/pig/pig-farm-controller/internal/infra/repository"
"github.com/gin-gonic/gin"
"github.com/golang-jwt/jwt/v5"
"gorm.io/gorm"
)
// jwtSecret 是用于签名 JWT 的密钥。在生产环境中,这应该从环境变量或安全配置中读取。
var jwtSecret = []byte("your_super_secret_jwt_key")
// Controller 用户控制器
type Controller struct {
userRepo repository.UserRepository
logger *logs.Logger
userRepo repository.UserRepository
logger *logs.Logger
tokenService token.TokenService // 注入 token 服务
}
// NewController 创建用户控制器实例
func NewController(userRepo repository.UserRepository, logger *logs.Logger) *Controller {
func NewController(userRepo repository.UserRepository, logger *logs.Logger, tokenService token.TokenService) *Controller {
return &Controller{
userRepo: userRepo,
logger: logger,
userRepo: userRepo,
logger: logger,
tokenService: tokenService,
}
}
@@ -55,24 +53,6 @@ type LoginResponse struct {
Token string `json:"token"`
}
// generateToken 为给定用户生成 JWT
func generateToken(userID uint, username string) (string, error) {
expirationTime := time.Now().Add(24 * time.Hour) // Token 24 小时后过期
claims := jwt.MapClaims{
"user_id": userID,
"username": username,
"exp": expirationTime.Unix(),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, err := token.SignedString(jwtSecret)
if err != nil {
return "", err
}
return tokenString, nil
}
// CreateUser 处理创建用户的请求
func (c *Controller) CreateUser(ctx *gin.Context) {
var req CreateUserRequest
@@ -134,7 +114,7 @@ func (c *Controller) Login(ctx *gin.Context) {
}
// 登录成功,生成 JWT token
tokenString, err := generateToken(user.ID, user.Username)
tokenString, err := c.tokenService.GenerateToken(user.ID)
if err != nil {
c.logger.Errorf("Login: 生成 token 失败: %v", err)
controller.SendErrorResponse(ctx, http.StatusInternalServerError, "登录失败,无法生成认证信息")

View File

@@ -1,16 +1,17 @@
package token
package token_test
import (
"testing"
"time"
"git.huangwc.com/pig/pig-farm-controller/internal/app/service/token"
"github.com/golang-jwt/jwt/v5"
)
func TestGenerateToken(t *testing.T) {
// 使用一个测试密钥初始化 TokenService
testSecret := []byte("test_secret_key")
service := NewTokenService(testSecret)
service := token.NewTokenService(testSecret)
userID := uint(123)
tokenString, err := service.GenerateToken(userID)
@@ -46,7 +47,7 @@ func TestGenerateToken(t *testing.T) {
func TestParseToken(t *testing.T) {
// 使用一个测试密钥初始化 TokenService
testSecret := []byte("test_secret_key")
service := NewTokenService(testSecret)
service := token.NewTokenService(testSecret)
userID := uint(456)
@@ -74,7 +75,7 @@ func TestParseToken(t *testing.T) {
}
// 测试用例 3: 过期 token (创建一个过期时间在过去的 token)
expiredClaims := Claims{
expiredClaims := token.Claims{
UserID: userID,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(-time.Hour)), // 1 小时前