Brak opisu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

basic_auth_middewara.go 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package authbase
  2. import (
  3. "encoding/base64"
  4. "net/http"
  5. "strings"
  6. "time"
  7. "git.x2erp.com/qdy/go-base/config"
  8. "git.x2erp.com/qdy/go-base/ctx"
  9. )
  10. // BasicAuth 简化的Basic认证中间件
  11. func BasicAuth(next http.Handler) http.Handler {
  12. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  13. // 1. 检查认证头
  14. authHeader := r.Header.Get("Authorization")
  15. if authHeader == "" {
  16. unauthorized(w, "缺少认证信息")
  17. return
  18. }
  19. // 2. 检查Basic格式
  20. if !strings.HasPrefix(authHeader, "Basic ") {
  21. unauthorized(w, "认证格式错误,请使用Basic认证")
  22. return
  23. }
  24. // 3. 解码凭证
  25. base64Creds := strings.TrimPrefix(authHeader, "Basic ")
  26. credsBytes, err := base64.StdEncoding.DecodeString(base64Creds)
  27. if err != nil {
  28. unauthorized(w, "认证信息解码失败")
  29. return
  30. }
  31. // 4. 分割用户名密码
  32. creds := string(credsBytes)
  33. parts := strings.SplitN(creds, ":", 2)
  34. if len(parts) != 2 {
  35. unauthorized(w, "用户名密码格式错误")
  36. return
  37. }
  38. username := parts[0]
  39. password := parts[1]
  40. // 5. 验证用户名密码
  41. userID, tenantID, ok := verifyCredentials(username, password)
  42. if !ok {
  43. unauthorized(w, "用户名或密码错误")
  44. return
  45. }
  46. // 6. 创建请求上下文
  47. traceID := r.Header.Get("X-Trace-ID")
  48. if traceID == "" {
  49. // 生成简单的时间戳追踪ID
  50. traceID = time.Now().Format("20060102150405.000")
  51. }
  52. cfg := config.GetConfig()
  53. requestCtx := &ctx.RequestContext{
  54. ServiceName: cfg.GetServiceConfig().ServiceName,
  55. InstanceName: cfg.GetServiceConfig().InstanceName,
  56. TraceID: traceID,
  57. TenantID: tenantID,
  58. UserID: userID,
  59. Username: username,
  60. }
  61. // 7. 保存到请求
  62. r = ctx.SaveContext(r, requestCtx)
  63. // 8. 继续处理
  64. next.ServeHTTP(w, r)
  65. })
  66. }
  67. // 验证用户名密码(简单示例)
  68. func verifyCredentials(username, password string) (userID, tenantID string, ok bool) {
  69. // 这里替换为你的实际验证逻辑
  70. cfg := config.GetConfig()
  71. sysUsername := cfg.GetServiceConfig().Username
  72. sysPassword := cfg.GetServiceConfig().Password
  73. if username == sysUsername && password == sysPassword {
  74. return sysUsername, "tenant-admin", true
  75. }
  76. return "", "", false
  77. }