Keine Beschreibung
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

token_auth_middleware.go 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package auth
  2. import (
  3. "net/http"
  4. "strings"
  5. "git.x2erp.com/qdy/go-base/config"
  6. "git.x2erp.com/qdy/go-base/ctx"
  7. "git.x2erp.com/qdy/go-base/logger"
  8. )
  9. // // 全局配置(单例)
  10. // var appConfig config.IConfig
  11. // // ResponseFormat 响应格式
  12. // type ResponseFormat int
  13. // const (
  14. // FormatJSON ResponseFormat = iota
  15. // FormatCSV
  16. // )
  17. // // JWTAuthMiddlewareInit 初始化中间件配置
  18. // func JWTAuthMiddlewareInit(config config.IConfig) {
  19. // appConfig = config
  20. // }
  21. // JWT认证中间件(支持指定响应格式)
  22. func TokenAuth(next http.Handler) http.Handler {
  23. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  24. // 从Header获取Authorization
  25. authHeader := r.Header.Get("Authorization")
  26. // 检查Authorization头是否存在
  27. if authHeader == "" {
  28. unauthorized(w, "Authorization header is required")
  29. }
  30. // 检查Bearer格式
  31. if !strings.HasPrefix(authHeader, "Bearer ") {
  32. unauthorized(w, "Authorization header must start with 'Bearer '")
  33. }
  34. token := strings.TrimPrefix(authHeader, "Bearer ")
  35. // 验证JWT令牌
  36. if !isValidToken(token) {
  37. unauthorized(w, "Invalid token")
  38. }
  39. appConfig := config.GetConfig()
  40. //保存上下文
  41. // 创建LoggerContext(从token解析用户信息)
  42. requestContext := &ctx.RequestContext{
  43. ServiceName: appConfig.GetServiceConfig().ServiceName,
  44. InstanceName: appConfig.GetServiceConfig().InstanceName,
  45. TraceID: "trace_id-123", // 生成追踪ID
  46. TenantID: "tenant-123", // 从token解析
  47. UserID: "user-456", // 从token解析
  48. }
  49. if logger.IsDebug() {
  50. logger.DebugC(requestContext, "Before save requestContext: %+v", requestContext)
  51. }
  52. // 保存到请求
  53. r = ctx.SaveContext(r, requestContext)
  54. // 继续处理请求
  55. next.ServeHTTP(w, r)
  56. })
  57. }
  58. // 验证令牌(需要根据实际项目实现)
  59. func isValidToken(token string) bool {
  60. // TODO: 实现真正的JWT验证逻辑
  61. // 暂时简化处理
  62. return token != ""
  63. }